何时使用 Celery Groups 与延迟

When to Fan Out with Celery Groups vs. Delay

在学习芹菜的过程中尝试找出最佳实践。

我想在另一份工作中扇出一堆小工作。我知道分组是从一堆排队的较小作业中获得结果的好方法,但如果我不关心结果怎么办?我只想将一项大工作拆分成一堆小任务。在这种情况下,在循环中调用延迟是否是同一件事?

当想要扇出并在父作业中排队一堆较小的作业时,使用组仍然是最佳做法吗?下面是一些伪代码作为例子。

@app.task 
def call_job(job_args):
    groups([for small_job.s(x) for x in job_args]).delay()

@app.task
def small_job(x):
    # do something 

对比

@app.task 
def call_job(job_args):
    for x in job_args:
        small_job.delay(x)

@app.task
def small_job(x):
    # do something 

我认为你应该采用第二种方法(for 循环):

  • 如果您想知道所有较小的任务都已完成(因为您想一起查看它们的结果),请使用 group
  • 当另一个 action/task 应该仅在所有任务完成(弦)后发生时使用 group

在后台,有人(Celery 后端)需要负责管理已完成的任务,以便它可以回答小组结果是否为 ready()

最重要的是,如果您不关心任务的 return 价值并且完成所有任务与后续行动之间没有依赖关系 - 请使用 for 循环.