如何在celery客户端中使用不带导入任务模块的画布?

时间:2018-08-10 09:14:53

标签: celery

假设我们有一个呼叫者A和一个被呼叫者BB实现了某些功能,并且具有很高的依赖性。

通常,我不想在A中导入这些依赖项以保持其轻量级。

以前,我可以很高兴地使用send_task来按名称呼叫B

现在,我有更复杂的逻辑,想用画布编排任务。遵循用户指南here signature('tasks.add', args=(2, 2), countdown=10)

我遇到任务NotRegistered错误。

如何按名称注册任务?

1 个答案:

答案 0 :(得分:0)

没有看到您的代码,我们实际上无法为您提供帮助。因此,我将使用文档大致回答您的问题:

作为参考,这是celery的示例片段:

from celery import Celery

app = Celery('tasks', broker='pyamqp://guest@localhost//')

@app.task
def add(x, y):
    return x + y

请注意,我们创建签名tasks.add是因为应用程序在tasks构造函数中被命名为Celery,而函数被命名为add。该任务已注册,因为它位于task.py文件中。因此,要按名称调用任务,我们必须确保三件事:

  1. 任务是否正确注册?我们可以通过查看芹菜工作者启动时的输出进行检查,该工作者输出已注册任务的列表。如果不是,请确保该任务位于celery知道要查找的task.py文件或tasks模块中。
  2. 我的应用程序名称是什么?我们可以通过寻找对Celery构造函数的调用来找到它。这是您在启动工作程序时传递给-A参数的内容。
  3. 我的任务名称是什么?如果在app.task装饰器中未指定名称,请使用函数名称。否则,请使用在name装饰器中指定的app.task

在确保(1)之后,将(2)和(3)连接起来,并在它们之间放置一个.,以获取要调用的任务名称。