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