芹菜链任务用例?

Celery chain task use case?

假设函数 a、b、...,必须按顺序 运行。 我们可以做一个任务来做到这一点:

def a(...):
    ...
def b(...):
    ...
...
@app.task
def abc(...):
    a(...)
    b(...)
    ...

或者,我们可以让它们成为单独的任务:

@app.task
def a(...):
    ...
@app.task
def b(...):
    ...
...

并将它们链接起来:

@app.task
def abc(...):
    chain(a.s(...), b.s(...), ...)
    ...

第一个版本比第二个版本快(可能快不了多少,取决于任务开销与在 a、b、... 中花费的平均时间)。我想 chain 肯定是有原因的,但我还没弄明白。

有几个用例:

  1. 您只希望 celery 客户端可以组合您的任务,而不是在 celery 代码库中预定义工作流(即,您可以在客户端上使用链来提交任务!)
  2. 您想独立监控每个子任务。因为 Chain 将每个子任务作为一个单独的任务启动,所以每个子任务都可以独立于另一个进行监控。如果你有一个函数调用其他两个作为 python 函数,你就不能连接到 celery 监控中。
  3. 您想要专门化 workers/servers 以便链的任务 A 在一种类型的服务器上运行而链的任务 B 在另一种服务器上运行(例如为了安全)。

这个列表可以继续下去,但我确实在生产环境中使用了所有这三个。祝你好运!