我正在运行First Steps with Celery Tutorial。
我们定义以下任务:
from celery import Celery
app = Celery('tasks', broker='amqp://guest@localhost//')
@app.task
def add(x, y):
return x + y
然后叫它:
>>> from tasks import add
>>> add.delay(4, 4)
但是我收到以下错误:
AttributeError: 'DisabledBackend' object has no attribute '_get_task_meta_for'
我正在运行芹菜工作者和兔子mq服务器。相当奇怪的是,芹菜工作者将任务报告为成功:
[2014-04-22 19:12:03,608: INFO/MainProcess] Task test_celery.add[168c7d96-e41a-41c9-80f5-50b24dcaff73] succeeded in 0.000435483998444s: 19
为什么这不起作用?
答案 0 :(得分:43)
继续阅读教程。它将在Keep Results章节中解释。
要启动Celery,您需要提供just broker参数,这是发送有关任务的消息所必需的。如果要检索有关已完成任务返回的状态和结果的信息,则需要设置后端参数。您可以在Configuration docs: CELERY_RESULT_BACKEND找到包含说明的完整列表。
答案 1 :(得分:36)
我建议看看: http://www.cnblogs.com/fangwenyu/p/3625830.html
在那里你会看到 而不是
app = Celery('tasks', broker='amqp://guest@localhost//')
你应该写
app = Celery('tasks', backend='amqp', broker='amqp://guest@localhost//')
就是这样。
答案 2 :(得分:18)
如果有人像我一样容易犯错误:教程没有明确说明,但行
app = Celery('tasks', backend='rpc://', broker='amqp://')
是tasks.py
文件中该行的编辑。我现在读到:
app = Celery('tasks', backend='rpc://', broker='amqp://guest@localhost//')
当我从命令行运行python时,我得到:
$ python
>>> from tasks import add
>>> result = add.delay(4,50)
>>> result.ready()
>>> False
所有教程都应该易于理解,即使有点醉。到目前为止,这个没有达到那个标准。
答案 3 :(得分:1)
找到设置文件。
然后:sudo vim settings.py 复制/粘贴到settings.py:CELERY_RESULT_BACKEND =' djcelery.backends.database:DatabaseBackend'
注意:如果您使用django-celery作为后端来将消息存储在队列中,那就是这样。
答案 4 :(得分:0)
本教程不清楚的是,需要编辑task.py模块,以便您更改行:
app = Celery('tasks', broker='pyamqp://guest@localhost//')
包括RPC结果后端:
app = Celery('tasks', backend='rpc://', broker='pyamqp://')
完成后,按 Ctrl + C 芹菜工作者进程并重新启动它:
celery -A tasks worker --loglevel=info
本教程令人困惑,因为我们假设应用程序对象的创建是在客户端测试会话中完成的,而事实并非如此。
答案 5 :(得分:0)
Celery 既依赖后端又依赖代理。 这为我只使用 Redis 解决了这个问题:
app = Celery("tasks", backend='redis://localhost',broker="redis://localhost")
更改配置后记得在终端中重启worker
答案 6 :(得分:-1)
我遇到了同样的问题,为我解决的是在你的应用程序的 init 函数中导入 celery 文件(celery.py),如下所示:
from .celery import CELERY_APP as celery_app
__all__ = ('celery_app',)
如果您使用 celery.py 文件,here