芹菜 - 在完成任务时迭代

时间:2013-08-11 19:31:48

标签: python celery

也许我对芹菜有些误解,但我已经坚持了很长一段时间。

我有一些简单的子任务,我想并行运行,我希望在完成时迭代它们,而不是等待所有这些完成。我试过这个:

def task_generator():
   for row in db:
      yield mytask.s(row)

from celery.result import ResultSet
r = ResultSet(t.delay() for t in task_generator())
for result in r.iterate():
    print result

然而,celery首先运行所有任务,并且只有在完成所有任务之后才开始迭代,尽管ResultSet.iterate的文档阅读"Iterate over the return values of the tasks as they finish one by one."

那么如何在完成任务结果时迭代它?

1 个答案:

答案 0 :(得分:0)

我已经实现了这个,并且过去曾经使用过它。我认为.iterate()已被弃用,所以我自己正在研究一种新的解决方案。

@task
def task_one(foo, bar):
    return foo + bar

subtasks = []
for x in range(10):
    subtasks.append(task_one.s(x, x+1))

results = celery.Group(subtasks)()  # call this
for result in results.iterate(propagate=False):
    answer = result.iteritems().next()