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

时间:2013-04-03 01:18:58

标签: python asynchronous gevent

我想使用gevent发出异步HTTP POST请求 - 我不关心响应,我只想尽快执行请求。但是,每当我尝试使用gevent.spawn执行此操作时,请求永远不会执行。我知道这一点,因为调用从.ready()返回的.successful()上的Greenletgevent.spawn方法始终返回False

但是,Greenlet 已启动,因为如果我拨打glet = gevent.spawn(...),然后glet.start(),我会收到错误AssertionError: Greenlet already started

我收到glet.ready() == True的唯一时间是我致电glet.join(),但这是阻止操作。如何在不等待Greenlet完成的情况下执行Greenlet?

1 个答案:

答案 0 :(得分:9)

由于greenlets是合作的,所以你的新greenlet不会运行直到你屈服于它。调用spawn后,调用gevent.sleep(0)来生成并运行greenlet。

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

编辑:

要解决有关grequests的问题,grequests.send() doc说:

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()