Celery任务和子任务有什么区别?

时间:2016-10-02 19:59:50

标签: python celery

如果我正确理解了教程,那么Celery 子任务支持与任务几乎相同的API,但还有一个额外的好处就是它可以传递给其他函数或进程

显然,如果是这种情况,Celery会简单地用子任务替换任务,而不是同时保留两者(例如,@app.task装饰器会转换子任务的功能,而不是任务等的功能。所以我一定是在误解。

任务可以做子任务不能做什么?

Celery API改变了很多;我的问题特定于3.1版(目前,最新版)。

编辑:

我知道文档说子任务旨在从其他任务中调用。我的问题是什么阻止了Celery完全摆脱任务并在任何地方使用子任务?它们似乎比任务更加灵活/强大:

# tasks.py
from celery import Celery
app = Celery(backend='rpc://')

@app.task
def add(x, y):
    # just print out a log line for testing purposes
    print(x, y)

# client.py
from tasks import add
add_subtask = add.subtask()
# in this context, it seems the following two lines do the same thing
add.delay(2, 2)
add_subtask.delay(2, 2)
# when we need to pass argument to other tasks, we must use add_subtask
# so it seems add_subtask is strictly better than add

1 个答案:

答案 0 :(得分:1)

当你开始使用芹菜的complex workflows时,你会考虑到差异。

  

signature()包装参数,关键字参数和执行   单个任务调用的选项,使其可以   传递给函数,甚至通过电汇进行序列化和发送。

     

签名通常被称为“子任务”,因为它们描述了一项任务   在任务中被调用。

此外:

  

子任务是用于传递任务签名的对象   调用,(例如通过网络发送)

Task只是一个用decorator包装的函数定义,但是subtask是一个传递参数但尚未启动的任务。您可以通过网络传输序列化的子任务,或者更常用的,在组/链/和弦中调用它。