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)
如果您尝试从命令行(或文件)运行,将不会发送请求。
玩弄之后,如果我满足以下条件,我设法获得了发送请求的代码:
- 删除猴子补丁线(这不好,因为那样会阻塞),或
- 将
sleep
的值更改为 0.1 (这不好,因为我真的不想让主循环休眠)。
这两个选项对我来说都是一个很大的否定。
有没有人知道为什么会出现这种奇怪的行为,我该如何解决?
好吧,事实证明这是我们想要的行为。
link 关于此主题的更多详细信息:https://github.com/gevent/gevent/issues/744
所以,我认为你需要的是:gevent.joinall([g1, g2, ...])
,而不是gevent.sleep
经过一整天的黑客攻击并试图弄清楚这里出了什么问题,我才问这个问题。
我想使用 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)
如果您尝试从命令行(或文件)运行,将不会发送请求。
玩弄之后,如果我满足以下条件,我设法获得了发送请求的代码:
- 删除猴子补丁线(这不好,因为那样会阻塞),或
- 将
sleep
的值更改为 0.1 (这不好,因为我真的不想让主循环休眠)。
这两个选项对我来说都是一个很大的否定。
有没有人知道为什么会出现这种奇怪的行为,我该如何解决?
好吧,事实证明这是我们想要的行为。
link 关于此主题的更多详细信息:https://github.com/gevent/gevent/issues/744
所以,我认为你需要的是:gevent.joinall([g1, g2, ...])
,而不是gevent.sleep