3

代码:

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,所以我希望它永远不会执行;或者,考虑到长时间的 sleep(),它应该在第二个 greenlet 之后完成。

语境:

我希望能够启动一个“一次性”greenlet,它填充一个我从不加入的缓存,我也不想阻止等待结果。

4

1 回答 1

5

这是因为time.sleep()不是 gevent-aware,所以当join()被调用时,执行流程将是:

  1. gevent.spawn(a)— 将“spawn a”操作推入事件队列
  2. gevent.spawn(b)— 将“spawn b”操作推入事件队列
  3. .join()— 导致主线程让出并执行事件队列中的下一个事件(在这种情况下,a
  4. a执行time.sleep(4),阻塞整个进程 4 秒(但线程a不屈服,因为time.sleep()不支持 gevent)
  5. a终止并执行事件队列中的下一个事件(在这种情况下,b
  6. b执行并终止,并执行队列中的下一个事件(在这种情况下,跳回主线程,导致.join()返回)

使用gevent.monkeygevent.sleep()按您的预期查看此执行。

于 2013-03-01T17:58:52.790 回答