コード例 #1
0
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
コード例 #2
0
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
コード例 #3
0
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()
コード例 #4
0
ファイル: demo_heartbeat.py プロジェクト: breezechen/syncless
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()
コード例 #5
0
ファイル: schedule_test.py プロジェクト: olopez32/syncless
 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')
コード例 #6
0
ファイル: schedule_test.py プロジェクト: breezechen/syncless
 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')
コード例 #7
0
ファイル: schedule_test.py プロジェクト: olopez32/syncless
    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()
コード例 #8
0
ファイル: schedule_test.py プロジェクト: breezechen/syncless
  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()
コード例 #9
0
ファイル: schedule_test.py プロジェクト: breezechen/syncless
  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))
コード例 #10
0
ファイル: schedule_test.py プロジェクト: olopez32/syncless
    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))
コード例 #11
0
ファイル: schedule_test.py プロジェクト: breezechen/syncless
  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()
コード例 #12
0
ファイル: schedule_test.py プロジェクト: olopez32/syncless
    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()
コード例 #13
0
    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)
コード例 #14
0
ファイル: queue_test.py プロジェクト: breezechen/syncless
  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)
コード例 #15
0
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")
コード例 #16
0
ファイル: schedule_test.py プロジェクト: breezechen/syncless
 def Worker(name, count):
   while count > 0:
     events.append(name)
     count -= 1
     if count > 0:
       stackless.schedule()
コード例 #17
0
ファイル: schedule_test.py プロジェクト: olopez32/syncless
 def Worker(name, count):
     while count > 0:
         events.append(name)
         count -= 1
         if count > 0:
             stackless.schedule()
コード例 #18
0
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')