Python 使用asyncio从芹菜工人处收集结果

Python 使用asyncio从芹菜工人处收集结果,python,celery,python-asyncio,Python,Celery,Python Asyncio,我有一个Python应用程序,它将大量处理工作卸载给一组芹菜工人。然后,主应用程序必须等待这些工作者的结果。当一个worker提供结果时,主应用程序将处理结果并安排更多的worker执行 我希望主应用程序以非阻塞方式运行。到目前为止,我有一个轮询功能,以查看是否有任何工作人员提供结果 我正在研究使用asyncio get通知结果可用性的可能性,以便避免轮询。但是,我找不到任何关于如何做到这一点的信息 任何关于这方面的建议都将不胜感激 PS:我知道使用gevent,我可以避免投票。但是,我使用的是

我有一个Python应用程序,它将大量处理工作卸载给一组芹菜工人。然后,主应用程序必须等待这些工作者的结果。当一个worker提供结果时,主应用程序将处理结果并安排更多的worker执行

我希望主应用程序以非阻塞方式运行。到目前为止,我有一个轮询功能,以查看是否有任何工作人员提供结果

我正在研究使用asyncio get通知结果可用性的可能性,以便避免轮询。但是,我找不到任何关于如何做到这一点的信息

任何关于这方面的建议都将不胜感激


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客户端。谢谢!!!多亏了你,我从启动芹菜任务的类中找到了更新实例变量的方法!先生,你让我高兴极了