StacklessPy的Sleep 方式

@googlegroups.com>
date    Wed, Feb 4, 2009 at 21:33
subject [eurasia-users] Re: StopIteration: the main tasklet is receiving without a sender available.

eruaisa的

欢迎进入 Stackless Python 的世界!

   1 import sqlite3, sha
   2 from time import time
   3 from random import random
   4 from sqlite3 import IntegrityError
   5 from stackless import tasklet, schedule, channel
   6 
   7 def sleep(sec):
   8        c = channel()
   9        while True:
  10                uid = sha.new('%s' % random()).hexdigest()
  11 
  12                try:
  13                        cursor.execute(
  14                                'INSERT INTO hypnus VALUES (?, ?)',
  15                                (uid, time() + sec) )
  16                        break
  17                except IntegrityError:
  18                        continue
  19 
  20        channels[uid] = c
  21        c.receive()
  22 
  23 def tasklets():
  24        while True:
  25                now = time()
  26                l = cursor.execute(
  27                        'SELECT id FROM hypnus WHERE timeout<?',
  28                        (now, ) ).fetchall()
  29                for i in l:
  30                        uid = i[0]
  31                        c = channels[uid]
  32                        del channels[uid]
  33 
  34                        c.send(None)
  35                if l:
  36                        cursor.execute(
  37                                'DELETE FROM hypnus WHERE timeout<?',
  38                                (now, ))
  39                schedule()
  40 
  41 cursor = sqlite3.connect(':memory:').cursor()
  42 cursor.execute( ( 'CREATE TABLE IF NOT EXISTS hypnus '
  43        '(id TEXT PRIMARY KEY, timeout FLOAT NOT NULL)' ) )
  44 cursor.execute('CREATE INDEX idx_timeout on hypnus(timeout)')
  45 channels = {}; tasklet(tasklets)()
  46 
  47 __import__('time').sleep = sleep

官方sleep

   1 import stackless
   2 sleepingTasklets = []
   3 sleepingTicks = 0
   4 
   5 def sleep(secondsToWait):
   6        channel = stackless.channel()
   7        endTime = sleepingTicks + secondsToWait
   8        sleepingTasklets.append((endTime, channel))
   9        sleepingTasklets.sort()
  10        channel.receive()
  11 
  12 def ManageSleepingTasklets():
  13        global sleepingTicks
  14        while 1:
  15                if len(sleepingTasklets):
  16                        endTime = sleepingTasklets[0][0]
  17                        while endTime <= sleepingTicks:
  18                                channel = sleepingTasklets[0][1]
  19                                del sleepingTasklets[0]
  20                                channel.send(None)
  21                                endTime = sleepingTasklets[0][0] # 检查下一个
  22                sleepingTicks += 1
  23                print "1 second passed"
  24                stackless.schedule()
  25 
  26 stackless.tasklet(ManageSleepingTasklets)()


反馈

创建 by -- ZoomQuiet [2009-02-04 13:47:49]

MiscItems/2009-02-04 (last edited 2009-12-25 07:14:54 by localhost)