将n个任务添加到芹菜队列并等待结果

时间:2014-11-01 06:42:08

标签: python django celery django-celery

我会将多个任务添加到芹菜队列并等待结果。我有各种各样的想法,如何利用某种形式的共享存储(memcached,redis,db等)实现这一点,但是,我会认为它是Celery可以自动处理的东西,但我不能在线查找任何资源。

代码示例

def do_tasks(b):
    for a in b:
        c.delay(a)

    return c.all_results_some_how()

3 个答案:

答案 0 :(得分:30)

对于 Celery> = 3.0 ,TaskSet deprecated支持group

from celery import group
from tasks import add

job = group([
             add.s(2, 2),
             add.s(4, 4),
             add.s(8, 8),
             add.s(16, 16),
             add.s(32, 32),
])

在后台启动群组:

result = job.apply_async()

等待:

result.join()

答案 1 :(得分:15)

Task.delay返回AsyncResult。使用AsyncResult.get获取每项任务的结果。

为此,您需要保留对任务的引用。

def do_tasks(b):
    tasks = []
    for a in b:
        tasks.append(c.delay(a))
    return [t.get() for t in tasks]

或者您可以使用ResultSet

def do_tasks(b):
    rs = ResultSet([])
    for a in b:
        rs.add(c.delay(a))
    return rs.get()

答案 2 :(得分:2)

我有预感,你不是真的想要延迟,而是Celery的异步功能。

我认为你真的想要一个TaskSet

from celery.task.sets import TaskSet
from someapp.tasks import sometask

def do_tasks(b):
    job = TaskSet([sometask.subtask((a,)) for a in b])
    result = job.apply_async()
    # might want to handle result.successful() == False
    return result.join()