gevent monkey patch打破gevent.sleep(0)?

时间:2016-02-17 15:46:00

标签: python python-requests gevent

我在整整一天的黑客攻击后问这个问题并试图弄清楚这里有什么问题。
我想使用requests包发送请求,并以非阻止模式执行 为此,我使用了具有猴子修补功能的精细gevent包,我已经使用了很长时间。

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

以下代码是一个简化示例(没有主循环):

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)

如果您尝试从命令行(或文件)运行if,将不会发送请求
玩完之后,我设法让这段代码发送请求,如果我:

  1. 删除猴子修补线(这不好,因为它会阻塞),
  2. sleep的值更改为 0.1 (这不好,因为我真的不希望主循环进入睡眠状态。)
  3. 这两个选项对我来说都是一个很大的选择 任何人都知道为什么会出现这种奇怪的行为以及如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

嗯,结果证明这是理想的行为 以下是有关此主题的更多详细信息的链接:https://github.com/gevent/gevent/issues/744

答案 1 :(得分:0)

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