9

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

但是,Greenlet已经启动,因为如果我调用glet = gevent.spawn(...), then glet.start(),我会收到一条错误消息AssertionError: Greenlet already started

我得到 a 的唯一时间glet.ready() == True是当我打电话时glet.join(),但这是一个阻塞操作。我怎样才能让 Greenlet 在不等待它完成的情况下执行?

4

1 回答 1

9

由于greenlet 是合作的,因此您的新greenlet 在您屈服之前不会运行。调用 spawn 后,调用gevent.sleep(0)yield 并且你的 greenlet 应该运行。

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

编辑:

为了解决您关于 的问题grequestsgrequests.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 就已经完成了。要获得响应,请参阅glt.get()返回的 greenlet。

于 2013-04-03T01:26:56.477 回答