gpt4 book ai didi

python - 为什么gevent会执行这个未连接的greenlet?

转载 作者:太空宇宙 更新时间:2023-11-03 14:28:51 25 4
gpt4 key购买 nike

代码:

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,该 greenlet 填充一个我从未加入过的缓存,我也不想阻塞以等待其结果。

最佳答案

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

  1. gevent.spawn(a) — 将“生成 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() 以查看其性能是否符合您的预期。

关于python - 为什么gevent会执行这个未连接的greenlet?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15163863/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com