假设我们有一个调用方A
和一个被叫方B
。B
实现了一些功能,并且具有繁重的依赖关系。
通常,我不想在A
中导入这些依赖项以保持轻量级。
以前,我很乐意使用send_task
来直呼B
的名字。
现在我有更复杂的逻辑,并希望使用 canvas 编排任务。遵循此处的用户指南:
signature('tasks.add', args=(2, 2), countdown=10)
我收到一个任务NotRegistered
错误。
如何按名称注册任务?
如果没有看到您的代码,我们实际上无法为您提供帮助。 因此,我将使用文档一般回答您的问题:
作为参考,以下是芹菜的示例片段:
from celery import Celery
app = Celery('tasks', broker='pyamqp://guest@localhost//')
@app.task
def add(x, y):
return x + y
请注意,我们创建签名tasks.add
是因为应用程序在Celery
构造函数中被命名为tasks
,函数名为add
。 已注册此任务,因为它位于 tasks.py 文件中。 因此,要按名称调用任务,我们必须确保三件事:
- 任务是否正确注册? 我们可以通过查看芹菜工作线程启动时的输出来检查,并且工作线程输出已注册任务的列表。 如果没有,请确保任务位于芹菜知道要查找的 tasks.py 文件或
tasks
模块中。 - 我的应用程序名称是什么? 我们可以通过查找对
Celery
构造函数的调用来找到这一点。 它是您在启动工作线程时传递给-A
参数的内容。 - 我的任务名称是什么? 如果未在
app.task
修饰器中指定名称,请使用函数名称。 否则,请使用app.task
装饰器中指定的name
。
确保 (1( 后,连接 (2( 和 (3(,并在它们之间放置一个.
以获取要调用的任务名称。