芹菜链任务用例?
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
肯定是有原因的,但我还没弄明白。
有几个用例:
- 您只希望 celery 客户端可以组合您的任务,而不是在 celery 代码库中预定义工作流(即,您可以在客户端上使用链来提交任务!)
- 您想独立监控每个子任务。因为 Chain 将每个子任务作为一个单独的任务启动,所以每个子任务都可以独立于另一个进行监控。如果你有一个函数调用其他两个作为 python 函数,你就不能连接到 celery 监控中。
- 您想要专门化 workers/servers 以便链的任务 A 在一种类型的服务器上运行而链的任务 B 在另一种服务器上运行(例如为了安全)。
这个列表可以继续下去,但我确实在生产环境中使用了所有这三个。祝你好运!
假设函数 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
肯定是有原因的,但我还没弄明白。
有几个用例:
- 您只希望 celery 客户端可以组合您的任务,而不是在 celery 代码库中预定义工作流(即,您可以在客户端上使用链来提交任务!)
- 您想独立监控每个子任务。因为 Chain 将每个子任务作为一个单独的任务启动,所以每个子任务都可以独立于另一个进行监控。如果你有一个函数调用其他两个作为 python 函数,你就不能连接到 celery 监控中。
- 您想要专门化 workers/servers 以便链的任务 A 在一种类型的服务器上运行而链的任务 B 在另一种服务器上运行(例如为了安全)。
这个列表可以继续下去,但我确实在生产环境中使用了所有这三个。祝你好运!