celery 任务装饰器抛出“TypeError: '模块对象不可调用”

TC *_*Fox 5 python django celery django-celery

我拼命地想让 Celery 与 Django 很好地合作,但没有成功。我被以下问题绊倒了:

项目/设置.py:

...

import djcelery
djcelery.setup_loader()

BROKER_URL = 'django://'
CELERY_RESULT_BACKEND = 'django://'
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_ENABLE_UTC = True

...
Run Code Online (Sandbox Code Playgroud)

应用程序/任务.py:

from celery.task import task

@task()
def scheduled_task(param1, param2):
    ...
    return something
Run Code Online (Sandbox Code Playgroud)

直接调用scheduled_task(param1, param2)(没有装饰器)可以按预期工作。然而,当添加装饰器并启动“开发”芹菜工人时,如下所示:

python manage.py celery worker --loglevel=info
Run Code Online (Sandbox Code Playgroud)

...我收到以下错误:

TypeError: 'module' object is not callable
Run Code Online (Sandbox Code Playgroud)

我已将其固定给@task装饰者。我尝试的每个组合都失败了,包括:

from celery import task
from celery.task import task
from celery.task.base import task

@task
@task()
@task.task
@task.task()
@celery.task
@celery.task()
Run Code Online (Sandbox Code Playgroud)

异常中的调用堆栈似乎没有任何区别,它们似乎都认为这task是一个模块,并且不可调用!让事情变得更令人沮丧的是:

>>> from celery.task import task
>>> task
<function task at 0x10aa2a758>
Run Code Online (Sandbox Code Playgroud)

这对我来说确实看起来值得调用!知道会发生什么吗?如果我遗漏了任何内容,我很乐意发布额外的日志、文件或澄清其他任何内容。

Luk*_*raf 1

(根据评论转换为答案)

\n

堆栈跟踪中我认为该行return backend(app=self, url=url)是异常发生的地方。

\n

所以无论backend是什么,它似乎都不是可调用的。celery/app/base.py我会尝试通过将该行包含在该文件()中设置 pdb 断点

\n
try:\n    backend(app=self, url=url)\nexcept:\n    import pdb; pdb.set_trace(),\n
Run Code Online (Sandbox Code Playgroud)\n

然后检查backend并向上移动堆栈(updb 中的命令, d再次向下移动,w显示调用堆栈)以调试出现问题的位置。

\n

celery 文档也提到了这一点:

\n
\n

如何导入任务装饰器?

\n

任务装饰器在您的 Celery 实例上可用,如果您不\xe2\x80\x99 不知道那是什么,那么请阅读 Celery 的第一步。

\n

如果您\xe2\x80\x99正在使用Django或仍在使用\xe2\x80\x9cold\xe2\x80\x9d基于模块的celery API,那么您可以像这样导入任务装饰器:

\n
\n
from celery import task\n\n@task\ndef add(x, y):\n    return x + y\n
Run Code Online (Sandbox Code Playgroud)\n

因此,这应该可以消除有关导入任务装饰器的正确方式的任何歧义。

\n