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)
这对我来说确实看起来值得调用!知道会发生什么吗?如果我遗漏了任何内容,我很乐意发布额外的日志、文件或澄清其他任何内容。
(根据评论转换为答案)
\n从堆栈跟踪中我认为该行return backend(app=self, url=url)是异常发生的地方。
所以无论backend是什么,它似乎都不是可调用的。celery/app/base.py我会尝试通过将该行包含在该文件()中设置 pdb 断点
try:\n backend(app=self, url=url)\nexcept:\n import pdb; pdb.set_trace(),\nRun Code Online (Sandbox Code Playgroud)\n然后检查backend并向上移动堆栈(updb 中的命令, d再次向下移动,w显示调用堆栈)以调试出现问题的位置。
celery 文档也提到了这一点:
\n\n\n如何导入任务装饰器?
\n任务装饰器在您的 Celery 实例上可用,如果您不\xe2\x80\x99 不知道那是什么,那么请阅读 Celery 的第一步。
\n如果您\xe2\x80\x99正在使用Django或仍在使用\xe2\x80\x9cold\xe2\x80\x9d基于模块的celery API,那么您可以像这样导入任务装饰器:
\n
from celery import task\n\n@task\ndef add(x, y):\n return x + y\nRun Code Online (Sandbox Code Playgroud)\n因此,这应该可以消除有关导入任务装饰器的正确方式的任何歧义。
\n| 归档时间: |
|
| 查看次数: |
11340 次 |
| 最近记录: |