我如何才能等到所有芹菜任务完成后再继续执行代码

时间:2019-03-25 20:04:36

标签: python celery

我有一个很大的csv文件,我将其分成一个由100000行组成的块的列表,将每个块传递给函数以进行复杂的计算,然后将结果附加到global_list中。 当最后一块完成时,我将使用global_list并进行一些统计。 我该如何要求celery并行处理所有块,但要等到最后一个任务/最后一个块完成后再在global_list上执行功能complex_calc?

谢谢您的帮助

for chunk in global_chunk_list:
   def func_calc.delay(chunk) #<<<<< use celery tasks

complex_calc(global_list) #<<<<< should only start when processing 
last chunk is finished 

@celery.task(name='func_calc')     
def func_calc(chunk):
  ...
  #save chunk in a global list
  global_list.append(result)

def complex_calc(global_list):
 ...

1 个答案:

答案 0 :(得分:0)

适当的方法是使用Groupsjoin方法来等待一组并行任务以完成执行。

task_group = group([func_calc.s(chunk) for chunk in global_chunk_list])
result_group = task_group.apply_async()
results = result_group.join()  # wait for all results

另请参阅文档中的示例。 (一个区别是使用join而不是get,它等待任务完成)。另请参见this answer

>>> 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.ready()  # have all subtasks completed?
True
>>> result.successful() # were all subtasks successful?
True
>>> result.get()
[4, 8, 16, 32, 64]

要有效地执行此操作,您需要配置一个结果后端。