我想使用gevent
发出异步HTTP POST请求 - 我不关心响应,我只想尽快执行请求。但是,每当我尝试使用gevent.spawn
执行此操作时,请求永远不会执行。我知道这一点,因为调用从.ready()
返回的.successful()
上的Greenlet
或gevent.spawn
方法始终返回False
。
但是,Greenlet 已启动,因为如果我拨打glet = gevent.spawn(...)
,然后glet.start()
,我会收到错误AssertionError: Greenlet already started
。
我收到glet.ready() == True
的唯一时间是我致电glet.join()
,但这是阻止操作。如何在不等待Greenlet完成的情况下执行Greenlet?
答案 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()
。