def Foo(): thread_pool_obj = coio.thread_pool(3) stackless.tasklet(Sleeper)(thread_pool_obj, 9999) stackless.tasklet(Sleeper)(thread_pool_obj, 9999) stackless.tasklet(Sleeper)(thread_pool_obj, 2) stackless.schedule() f = lambda a, b: time.sleep(0.2) or a / b #f = lambda a, b: a / b #f = lambda a, b: sys.exit(42) print 'X0' if False: for i in xrange(1, 11): print i assert 42 == worker(f, 84 * i, 2 * i) print 'X1' # This first call is slow (takes about 2 seconds), because we have to wait for # a Sleeper to return. print thread_pool_obj(f, -42, -1) print 'X2' print thread_pool_obj(f, -42, -1) print 'X3' print thread_pool_obj(f, -42, -1) #print 'T' #time.sleep(10) print 'X4' try: thread_pool_obj(f, 7, 0) e = None except ZeroDivisionError, e: pass
def Worker(sock, addr): write_channel = stackless.channel() write_channel.preference = 1 # Prefer the sender. now_ts = time.time() timestamps = [now_ts, now_ts] # read_ts, write_ts writer_tasklet = stackless.tasklet(Writer)(timestamps, write_channel, sock) sleeper_tasklet = stackless.tasklet(Sleeper)(timestamps, write_channel, 3) # TODO(pts): Flush earlier. write_channel.send('Hello, please type something.\r\n') try: while True: msg = sock.recv(256) if not msg: break timestamps[0] = max(timestamps[0], time.time()) # Register read. # TODO(pts): Flush earlier. write_channel.send('You typed %r.\r\n' % msg) finally: logging.info('connection closed from %r' % (addr, )) if writer_tasklet.alive: write_channel.send(None) # Will kill writer_tasklet eventually. timestamps[0] = None # Will kill sleeper_tasklet eventually. while writer_tasklet.alive or sleeper_tasklet.alive: stackless.schedule(None) sock.close()
def Worker(sock, addr): write_channel = stackless.channel() write_channel.preference = 1 # Prefer the sender. now_ts = time.time() timestamps = [now_ts, now_ts] # read_ts, write_ts writer_tasklet = stackless.tasklet(Writer)(timestamps, write_channel, sock) sleeper_tasklet = stackless.tasklet(Sleeper)(timestamps, write_channel, 3) # TODO(pts): Flush earlier. write_channel.send('Hello, please type something.\r\n') try: while True: msg = sock.recv(256) if not msg: break timestamps[0] = max(timestamps[0], time.time()) # Register read. # TODO(pts): Flush earlier. write_channel.send('You typed %r.\r\n' % msg) finally: logging.info('connection closed from %r' % (addr,)) if writer_tasklet.alive: write_channel.send(None) # Will kill writer_tasklet eventually. timestamps[0] = None # Will kill sleeper_tasklet eventually. while writer_tasklet.alive or sleeper_tasklet.alive: stackless.schedule(None) sock.close()
def SenderWorker(name, count): while count > 0: events.append(name) count -= 1 if count > 0: stackless.schedule() events.append('R') nbf.write('S') nbf.flush() events.append('T')
def testFairSchedulingBlockedOnFile(self): events = [] def Worker(name, count): while count > 0: events.append(name) count -= 1 if count > 0: stackless.schedule() nbf = coio.nbfile(*os.pipe()) try: def SenderWorker(name, count): while count > 0: events.append(name) count -= 1 if count > 0: stackless.schedule() events.append('R') nbf.write('S') nbf.flush() events.append('T') def ReceiverWorker(name): events.append(name) nbf.read_at_most(1) events.append(name.lower()) stackless.tasklet(SenderWorker)('A', 3) stackless.tasklet(Worker)('B', 6) stackless.tasklet(ReceiverWorker)('W') stackless.tasklet(Worker)('C', 9) for i in xrange(32): stackless.schedule() self.assertEqual( 'ABWC' # First iteration, in tasklet creation order. 'ABC' # W is blocked on reading now. 'ARTBC' # A sends 'S' to wake up W. 'wBC' # W woken up, inserted to the beginning of the chain. 'BC' 'BC' 'C' # B's counter has expired. 'C' 'C', ''.join(events)) nbf.close() finally: nbf.close()
def testFairSchedulingWithoutFile(self): events = [] def Worker(name, count): while count > 0: events.append(name) stackless.schedule() count -= 1 stackless.tasklet(Worker)('A', 5) stackless.tasklet(Worker)('B', 9) stackless.tasklet(Worker)('C', 7) for i in xrange(10): stackless.schedule() self.assertEqual('ABCABCABCABCABCBCBCBB', ''.join(events))
def testFairSchedulingWithFile(self): events = [] def Worker(name, count): while count > 0: events.append(name) stackless.schedule() count -= 1 nbf = coio.nbfile(*os.pipe()) try: stackless.tasklet(Worker)('A', 5) stackless.tasklet(Worker)('B', 9) stackless.tasklet(Worker)('C', 7) for i in xrange(10): stackless.schedule() self.assertEqual('ABCABCABCABCABCBCBCBB', ''.join(events)) #self.assertEqual([nbf], coio.CurrentMainLoop().nbfs) finally: nbf.close()
def testBlockingQueueReverse(self): events = [] q = util.Queue() def Worker(prefix): while True: item = q.pop() events.append((prefix, item)) if not item: return stackless.tasklet(Worker)(1) stackless.tasklet(Worker)(2) self.assertEqual(0, q.pending_receiver_count) stackless.schedule() self.assertEqual(2, q.pending_receiver_count) self.assertEqual([], events) q.append('foo') self.assertEqual([], events) self.assertEqual(1, len(q)) stackless.schedule() self.assertEqual(0, len(q)) self.assertEqual([(1, 'foo')], events) q.append('bar') self.assertEqual(1, len(q)) self.assertEqual([(1, 'foo')], events) stackless.schedule() self.assertEqual(0, len(q)) self.assertEqual([(1, 'foo'), (2, 'bar')], events) self.assertEqual(2, q.pending_receiver_count) q.append(0) q.append(None) self.assertEqual(2, len(q)) self.assertEqual(0, q.pending_receiver_count) stackless.schedule() # Only this is different from testBlockingQueue. self.assertEqual([(1, 'foo'), (2, 'bar'), (1, None), (2, 0)], events) self.assertEqual(0, len(q)) self.assertEqual(0, q.pending_receiver_count)
seconds, because a thread pool of size 3 will be used by 4 threads doing a sleep of 2 seconds each, so the last sleep can only be started after the first thread has finished. """ __author__ = "[email protected] (Peter Szabo)" import sys import time from syncless.best_stackless import stackless from syncless import coio def ProgressReporter(delta_sec): while True: sys.stderr.write(".") coio.sleep(delta_sec) if __name__ == "__main__": stackless.tasklet(ProgressReporter)(0.05) thread_pool_obj = coio.thread_pool(4 - bool(len(sys.argv) > 1)) stackless.tasklet(thread_pool_obj)(time.sleep, 2) stackless.tasklet(thread_pool_obj)(time.sleep, 2) stackless.tasklet(thread_pool_obj)(time.sleep, 2) sys.stderr.write("S") stackless.schedule() thread_pool_obj(time.sleep, 2) sys.stderr.write("D\n")
def Worker(name, count): while count > 0: events.append(name) count -= 1 if count > 0: stackless.schedule()
seconds, because a thread pool of size 3 will be used by 4 threads doing a sleep of 2 seconds each, so the last sleep can only be started after the first thread has finished. """ __author__ = '[email protected] (Peter Szabo)' import sys import time from syncless.best_stackless import stackless from syncless import coio def ProgressReporter(delta_sec): while True: sys.stderr.write('.') coio.sleep(delta_sec) if __name__ == '__main__': stackless.tasklet(ProgressReporter)(0.05) thread_pool_obj = coio.thread_pool(4 - bool(len(sys.argv) > 1)) stackless.tasklet(thread_pool_obj)(time.sleep, 2) stackless.tasklet(thread_pool_obj)(time.sleep, 2) stackless.tasklet(thread_pool_obj)(time.sleep, 2) sys.stderr.write('S') stackless.schedule() thread_pool_obj(time.sleep, 2) sys.stderr.write('D\n')