Python 使用asyncio从芹菜工人处收集结果
我有一个Python应用程序,它将大量处理工作卸载给一组芹菜工人。然后,主应用程序必须等待这些工作者的结果。当一个worker提供结果时,主应用程序将处理结果并安排更多的worker执行 我希望主应用程序以非阻塞方式运行。到目前为止,我有一个轮询功能,以查看是否有任何工作人员提供结果 我正在研究使用asyncio get通知结果可用性的可能性,以便避免轮询。但是,我找不到任何关于如何做到这一点的信息 任何关于这方面的建议都将不胜感激Python 使用asyncio从芹菜工人处收集结果,python,celery,python-asyncio,Python,Celery,Python Asyncio,我有一个Python应用程序,它将大量处理工作卸载给一组芹菜工人。然后,主应用程序必须等待这些工作者的结果。当一个worker提供结果时,主应用程序将处理结果并安排更多的worker执行 我希望主应用程序以非阻塞方式运行。到目前为止,我有一个轮询功能,以查看是否有任何工作人员提供结果 我正在研究使用asyncio get通知结果可用性的可能性,以便避免轮询。但是,我找不到任何关于如何做到这一点的信息 任何关于这方面的建议都将不胜感激 PS:我知道使用gevent,我可以避免投票。但是,我使用的是
PS:我知道使用gevent,我可以避免投票。但是,我使用的是python3.4,因此我更愿意避免gevent并使用asyncio。您必须寻找
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())
我实现了芹菜工人的
on_finish
功能,将消息发布到redis
然后在主应用程序中使用
aioredis
订阅频道,一旦收到通知,结果已准备就绪请查看。抱歉,这里没有asyncio redis客户端。谢谢!!!多亏了你,我从启动芹菜任务的类中找到了更新实例变量的方法!先生,你让我高兴极了