【问题标题】:What's the difference between Celery task and subtask?Celery 任务和子任务有什么区别?
【发布时间】:2017-02-10 18:40:13
【问题描述】:

如果我对本教程的理解正确,Celery subtask 支持与 task 几乎相同的 API,但还有一个额外的优势,即它可以传递给其他函数或进程.

显然,如果是这样的话,Celery 会简单地将 tasks 替换为 subtasks 而不是保留两者(例如,@app.task 装饰器会转换一个函数子任务而不是任务等)。所以我一定是误会了什么。

任务能做什么而子任务不能?

Celery API 发生了很大变化;我的问题是针对 3.1 版(目前是最新版)。

编辑:

我知道文档说 subtasks 旨在从其他 tasks 中调用。我的问题是什么阻止 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

【问题讨论】:

标签: python celery


【解决方案1】:

当您开始将complex workflows 与 celery 一起使用时,您会考虑到差异。

签名() 包装参数、关键字参数和执行 单个任务调用的选项,使得它可以 传递给函数,甚至序列化并通过网络发送。

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

还有:

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

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

【讨论】:

  • 嗯,这很清楚,但我还是不明白我原来的问题的答案:严格来说,子任务不是比任务更强大/更灵活吗?为什么还要费心处理任务,为什么不从 Celery 中删除这个概念,只处理子任务呢?与任务不同,子任务可以传递,可以局部化,可以在复杂的工作流中组合。然而,子任务也有.delay() 方法,就像任务一样。有什么任务可以做而子任务不能做的事情吗?
  • 据我了解 - 是的,子任务看起来更灵活,因为它们允许组织工作流。但是,如果您不使用复杂的“画布”工作流程 - 您可以只使用任务。任务是比子任务更高级的抽象。子任务不过是一个序列化的任务。
  • task 是一个更高层次的抽象吗?.. 根据我的理解和您的回答,task 只能完成 subtask 的一小部分i> 可以做,也不能做任何 subtask 做不到的事情……为什么我要使用一个残缺的对象,而更强大的对象同样易于使用?
  • 首先,我猜task 在历史上排在第一位,而不是subtask。然后,subtask 只是signature 的别名,正如我们从代码中看到的那样。他们有不同的目标。 task 是一个实现管理执行过程的功能的类。 subtask 是此类在技术上包装到 dict-like 对象。当您将装饰器 @task 用于函数时 - 您会收到一个对象。它只是实现了方法subtask。您可以使用这些方法中的任何一种,但在 celery 中它们是不同的实体。
  • 历史:了解;但是您是否暗示 subtask 不向后兼容 task?为何如此? API 似乎相同,我缺少什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-07
相关资源
最近更新 更多