TableOfContents

Include(ZPyUGnav)

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的

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


反馈

创建 by -- ZoomQuiet [DateTime(2009-02-04T13:47:49Z)]

PageComment2

[:/PageCommentData:PageCommentData]