何时使用 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
循环.
在学习芹菜的过程中尝试找出最佳实践。
我想在另一份工作中扇出一堆小工作。我知道分组是从一堆排队的较小作业中获得结果的好方法,但如果我不关心结果怎么办?我只想将一项大工作拆分成一堆小任务。在这种情况下,在循环中调用延迟是否是同一件事?
当想要扇出并在父作业中排队一堆较小的作业时,使用组仍然是最佳做法吗?下面是一些伪代码作为例子。
@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
循环.