使用asyncio从芹菜工人那里收集结果

时间:2015-07-26 11:30:18

标签: python celery python-asyncio

我有一个Python应用程序,可以将一些处理工作卸载到一组芹菜工作者身上。主要应用程序必须等待这些工作人员的结果。当工作人员获得结果时,主应用程序将处理结果并安排更多工作人员执行。

我希望主应用程序以非阻塞方式运行。截至目前,我正在使用轮询功能来查看是否有任何工作人员可以获得结果。

我正在考虑使用asyncio获取有关结果可用性的通知的可能性,以便我可以避免轮询。但是,我找不到有关如何执行此操作的任何信息。

对此的任何指示都将受到高度赞赏。

PS:我知道gevent,我可以避免轮询。但是,我在python3.4上,因此宁愿避免使用gevent并使用asyncio。

2 个答案:

答案 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订阅频道,一旦得到通知,结果就准备好了