如果我正确理解了教程,那么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
答案 0 :(得分:1)
当你开始使用芹菜的complex workflows时,你会考虑到差异。
signature()包装参数,关键字参数和执行 单个任务调用的选项,使其可以 传递给函数,甚至通过电汇进行序列化和发送。
签名通常被称为“子任务”,因为它们描述了一项任务 在任务中被调用。
此外:
子任务是用于传递任务签名的对象 调用,(例如通过网络发送)
Task
只是一个用decorator包装的函数定义,但是subtask
是一个传递参数但尚未启动的任务。您可以通过网络传输序列化的子任务,或者更常用的,在组/链/和弦中调用它。