gevent为什么要执行这个未连接的greenlet



代码:

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()时,执行流将为:

  1. gevent.spawn(a)—将"派生a"操作推送到事件队列
  2. gevent.spawn(b)—将"派生b"操作推送到事件队列
  3. .join()——使主线程屈服,并执行事件队列中的下一个事件(在本例中为a(
  4. a执行time.sleep(4),阻塞整个进程4秒(但线程a没有屈服,因为time.sleep()不知道gevent(
  5. a终止并且执行事件队列中的下一个事件(在这种情况下,b(
  6. b执行并终止,队列上的下一个事件执行(在这种情况下,跳回到主线程,导致.join()返回(

使用gevent.monkey或gevent.sleep()可以看到它如您所期望的那样执行。

相关内容

  • 没有找到相关文章

最新更新