gevent 猴子补丁中断 gevent.sleep(0)?

gevent monkey patch breaks gevent.sleep(0)?

经过一整天的黑客攻击并试图弄清楚这里出了什么问题,我才问这个问题。
我想使用 requests 包发送请求,并以非阻塞模式执行。
为此,我使用了 fine gevent 包及其猴子补丁功能,我已经使用了很长时间。

我有一个主循环,它接收一条消息并生成一个新的 greenlet,为每条消息创建一个 POST 请求。在 spawn 命令之后,主循环执行 gevent.sleep(0) 以允许 greenlets 完成它们的工作。

下面的代码是一个简化的例子(没有主循环):

from gevent import monkey; monkey.patch_all()
import gevent    # (version 1.0.2)
import requests  # version 2.7.0

def f():
    requests.post('http://localhost:8888/', data='*' * 80)

gevent.spawn(f)
gevent.sleep(0)

如果您尝试从命令行(或文件)运行,将不会发送请求
玩弄之后,如果我满足以下条件,我设法获得了发送请求的代码:

  1. 删除猴子补丁线(这不好,因为那样会阻塞),
  2. sleep 的值更改为 0.1 (这不好,因为我真的不想让主循环休眠)。

这两个选项对我来说都是一个很大的否定。
有没有人知道为什么会出现这种奇怪的行为,我该如何解决?

好吧,事实证明这是我们想要的行为。
link 关于此主题的更多详细信息:https://github.com/gevent/gevent/issues/744

所以,我认为你需要的是:gevent.joinall([g1, g2, ...]),而不是gevent.sleep