python – 为什么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

期望:

我从不加入第一个greenlet,所以我希望它永远不会执行;或者,如果长睡眠(),它应该在第二个greenlet之后完成.

语境:

我希望能够启动一个“一次性”greenlet填充缓存,我永远不会加入,我永远不想阻止等待结果.

解决方法:

这是因为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()来查看此操作是否符合您的预期.

上一篇:python中的并发执行


下一篇:python – 循环似乎打破了命名空间方法中的“发出”事件[gevent-socketio]