代码:
import gevent
import time
def func(a, t):
time.sleep(t)
print "got here", a
gevent.spawn(func, 'a', 4)
gevent.spawn(func, 'b', 0).join()
time.sleep(3)
print "exit"
输出:
got here a
got here b
exit
期望:
我从不加入第一个greenlet,所以我希望它永远不会执行;或者,如果长睡眠(),它应该在第二个greenlet之后完成。
上下文:
我希望能够启动一个“一次性”的greenlet,它填充一个我从不加入的缓存,我永远不想阻止等待结果。
答案 0 :(得分:5)
这是因为time.sleep()
不是gevent-aware,所以当调用join()
时,执行流将是:
gevent.spawn(a)
- 将“spawn a”操作推送到事件队列gevent.spawn(b)
- 将“spawn b”操作推送到事件队列.join()
- 导致主线程生成并执行事件队列中的下一个事件(在本例中为a
)a
执行time.sleep(4)
,阻止整个过程持续4秒(但线程a
不会产生,因为time.sleep()
不是gevent-aware)a
终止并执行事件队列中的下一个事件(在本例中为b
)b
执行并终止,并执行队列中的下一个事件(在这种情况下,跳回主线程,导致.join()
返回)使用gevent.monkey或gevent.sleep()
按照您的预期观看此效果。