为什么gevent.spawn在调用Greenlet.join之前不执行参数化函数?

nep*_*une 9 python asynchronous gevent

我想发出一个异步HTTP POST请求gevent- 我不关心响应,我只是想尽快执行请求.但是,每当我尝试使用时gevent.spawn,请求都不会执行.我知道这一点,因为调用返回的那个.ready().successful()方法总是返回.Greenletgevent.spawnFalse

然而,Greenlet 已经开始,因为如果我打电话glet = gevent.spawn(...),那么glet.start(),我得到一个错误说AssertionError: Greenlet already started.

我得到的唯一一次glet.ready() == True是我打电话glet.join(),但这是一个阻止操作.如何在不等待Greenlet完成的情况下执行Greenlet?

Fat*_*ror 9

由于greenlets是合作的,你的新greenlet将不会运行,直到你屈服于它.在调用spawn之后,调用gevent.sleep(0)yield并运行greenlet.

它将继续运行,直到它执行导致它产生的东西(比如启动http req).然后你的其他代码可以重新恢复.

编辑:

为了解决您的问题grequests,该grequests.send()文档说:

send(r, pool=None, stream=False)
    Sends the request object using the specified pool. If a pool isn't
    specified this method blocks. Pools are useful because you can specify size
    and can hence limit concurrency
Run Code Online (Sandbox Code Playgroud)

由于您尚未指定池,因此请求阻止您的greenlet完成.换句话说,一旦它返回greenlet已经完成.要获得响应,请参阅glt.get()返回的greenlet.