我会将多个任务添加到芹菜队列并等待结果。我有各种各样的想法,如何利用某种形式的共享存储(memcached,redis,db等)实现这一点,但是,我会认为它是Celery可以自动处理的东西,但我不能在线查找任何资源。
代码示例
def do_tasks(b):
for a in b:
c.delay(a)
return c.all_results_some_how()
答案 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()