假设函数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
但我还没有弄清楚。
有几种用例:
- 你只希望你的任务可以由芹菜客户端组合,而不是在芹菜代码库中预定义工作流(即,你可以在客户端上使用链来提交任务!
- 您希望独立监视每个子任务。 由于链将每个子任务作为单独的任务启动,因此每个子任务都可以独立于另一个进行监控。 如果你有一个函数将另外两个函数称为 python 函数,则无法挂接到芹菜监控。
- 您希望专门化工作线程/服务器,以便链的任务 A 在一种类型的服务器上运行,链的任务 B 在另一种类型的服务器上运行(例如,为了安全(。
这个列表可以继续下去,但我肯定在生产环境中使用了这三个。 祝你好运!