如何在Celery中异步接收已处理的消息?

时间:2018-09-28 17:04:19

标签: python asynchronous concurrency rabbitmq celery

我正在使用Celery编写数据处理管道,因为这样可以大大加快速度。

考虑以下伪代码:


    from celery.result import ResultSet
    from some_celery_app import processing_task # of type @app.task

    def crunch_data():
        results = ResultSet([])
        for document in mongo.find(): #Around 100K - 1M documents
            job = processing_task.delay(document)
            results.add(job)

        return results.get()

    collected_data = crunch_data()
    #Do some stuff with this collected data

我成功启用了并发功能,产生了四个工作器,当我运行此脚本时,将对数据进行相应的处理,并且我可以做任何我想做的事。

我将RabbitMQ用作消息代理,并将rpc用作后端。

打开RabbitMQ管理界面时看到的内容:

  1. 首先,所有文档都已处理
  2. 然后,直到那时,才通过集合results.get()调用来检索文档。

我的问题:是否可以同时进行处理和后续检索?就我而言,由于所有文档都是彼此不依赖的原子实体,因此似乎无需等待作业被完全处理。

1 个答案:

答案 0 :(得分:0)

您可以尝试在ResultSet.get(callback=cbResult)中使用callback参数,然后可以在回调中处理结果。

def cbResult(task_id, value):
  print(value)
results.get(callback=cbResult)