eventlet 和 gevent 的文档都有几个关于如何异步生成 IO 任务并在后面获得结果的示例。但到目前为止,所有应该从异步调用返回值的示例,我总是在所有对spawn()
. 无论join()
是 , joinall()
, wait()
, waitall()
。这假设调用使用 IO 的函数是立即的,我们可以直接跳到我们正在等待结果的地方。
但在我的情况下,我想从一个可能很慢和/或任意大甚至无限的生成器中获得工作。
我显然不能这样做
pile = eventlet.GreenPile(pool)
for url in mybiggenerator():
pile.spawn(fetch_title, url)
titles = '\n'.join(pile)
因为mybiggenerator()
可能需要很长时间才能用完。因此,我必须在仍在产生异步调用的同时开始使用结果。
这可能通常是通过队列资源完成的,但我不太确定如何。假设我创建了一个队列来保存作业,从一个名为 P 的 greenlet 推送一堆作业,然后从另一个 greenlet C 弹出它们。在 C 中,如果我发现队列是空的,我怎么知道 P 是否推送了每个作业它必须推动还是只是在迭代的中间?
或者,Eventlet 允许我循环 apile
以获取返回值,但是我可以在不产生所有必须产生的作业的情况下开始这样做吗?如何?这将是一个更简单的选择。