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)]