我有一个Python应用程序,可以将一些处理工作卸载到一组芹菜工作者身上。主要应用程序必须等待这些工作人员的结果。当工作人员获得结果时,主应用程序将处理结果并安排更多工作人员执行。
我希望主应用程序以非阻塞方式运行。截至目前,我正在使用轮询功能来查看是否有任何工作人员可以获得结果。
我正在考虑使用asyncio获取有关结果可用性的通知的可能性,以便我可以避免轮询。但是,我找不到有关如何执行此操作的任何信息。
对此的任何指示都将受到高度赞赏。
PS:我知道gevent,我可以避免轮询。但是,我在python3.4上,因此宁愿避免使用gevent并使用asyncio。答案 0 :(得分:2)
您必须寻找asyncio.as_completed(coros)
。当不同的协程准备好结果时,它会产生。它返回一个迭代器,它按照它们完成的顺序产生 - 。您可能还想查看它与asyncio.gather(*coros)
的不同之处,import asyncio
from asyncio.coroutines import coroutine
@coroutine
def some_work(x, y):
print("doing some background work")
yield from asyncio.sleep(1.0)
return x * y
@coroutine
def some_other_work(x, y):
print("doing some background other work")
yield from asyncio.sleep(3.0)
return x + y
@coroutine
def as_when_completed():
# give me results as and when they are ready
coros = [some_work(2, 3), some_other_work(2, 3)]
for futures in asyncio.as_completed(coros):
res = yield from futures
print(res)
@coroutine
def when_all_completed():
# when everything is complete
coros = [some_work(2, 3), some_other_work(2, 3)]
results = yield from asyncio.gather(*coros)
print(results)
if __name__ == '__main__':
loop = asyncio.get_event_loop()
# loop.run_until_complete(when_all_completed())
loop.run_until_complete(as_when_completed())
一旦提交给它的所有内容都已完成,就会返回
dataStructure: 'plain'
答案 1 :(得分:1)
我实施on_finish
celery worker
功能,向redis
发布消息
然后在主应用程序中使用aioredis
订阅频道,一旦得到通知,结果就准备好了