首页 > 解决方案 > 何时用 Celery Groups 扇出与延迟

问题描述

当我学习芹菜时,试图在这里找出最佳实践。

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

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

@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 

标签: pythondjangocelery

解决方案


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

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

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

最重要的是,如果您不关心任务的返回值,并且在完成所有任务和后续操作之间没有依赖关系 - 请使用for循环。


推荐阅读