为什么gevent.spawn生成在调用格林莱特。加入吗?

2024-04-27 16:19:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用gevent发出异步httppost请求——我不关心响应,只想尽快执行请求。但是,每当我尝试使用gevent.spawn来执行此操作时,请求就永远不会执行。我知道这一点,因为对从gevent.spawn返回的.ready().successful()方法总是返回False。在

但是,Greenlet已经启动了,因为如果我调用glet = gevent.spawn(...),那么glet.start(),我会得到一个错误,说AssertionError: Greenlet already started。在

我唯一一次得到glet.ready() == True是在我调用glet.join()时,但这是一个阻塞操作。如何让Greenlet在不等待完成的情况下执行?在


Tags: 方法false错误geventgreenletstartready我会
1条回答
网友
1楼 · 发布于 2024-04-27 16:19:29

因为小菜是合作的,你的新菜鸟在你屈服之前不会运行。在调用spawn之后,调用gevent.sleep(0)以产生结果,您的greenlet应该运行。在

它将继续运行,直到它做了一些导致它屈服的事情(比如启动httpreq)。然后你的其他代码可以再次恢复。在

编辑:

为了回答您关于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

由于您没有指定池,请求阻止greenlet完成。换句话说,一旦它返回,greenlet就已经完成了。要获得响应,请参见返回的greenlet的glt.get()。在

相关问题 更多 >