代码:
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
预期:
我从来没有加入过第一个绿绿灯,所以我希望它永远不会执行;或者,考虑到长时间睡眠((,它应该在第二个绿灯之后完成。
上下文:
我希望能够启动一个"一次性"绿绿灯,填充一个我从未加入过的缓存,我也不想阻止它等待结果。
这是因为time.sleep()
不支持gevent,所以当调用join()
时,执行流将为:
gevent.spawn(a)
—将"派生a"操作推送到事件队列gevent.spawn(b)
—将"派生b"操作推送到事件队列.join()
——使主线程屈服,并执行事件队列中的下一个事件(在本例中为a
(a
执行time.sleep(4)
,阻塞整个进程4秒(但线程a
没有屈服,因为time.sleep()
不知道gevent(a
终止并且执行事件队列中的下一个事件(在这种情况下,b
(b
执行并终止,队列上的下一个事件执行(在这种情况下,跳回到主线程,导致.join()
返回(
使用gevent.monkey或gevent.sleep()
可以看到它如您所期望的那样执行。