芹菜链任务用例?

时间:2019-06-13 21:21:34

标签: python celery

假设必须依次运行函数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 个答案:

答案 0 :(得分:1)

有几种用例:

  1. 您只希望您的任务可由celery客户端组成,而不是在celery代码库中预定义工作流程(即,您可以在客户端上使用链来提交任务!)
  2. 您要独立监视每个子任务。由于链将每个子任务作为单独的任务启动,因此可以独立地监视每个子任务。如果您有一个函数将其他两个函数作为python函数调用,则您将无法加入celery监视。
  3. 您要专门化工作人员/服务器,以便链中的任务A在一种类型的服务器上运行,链中的任务B在另一种服务器上运行(例如,出于安全性考虑)。

列表可以继续,但是我肯定在生产环境中使用了这三个。祝你好运!