Celery与RabbitMQ:AttributeError:'DisabledBackend'对象没有属性'_get_task_meta_for'


71

我正在运行 使用Celery教程第一步”

我们定义以下任务:

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'

我正在同时运行celery worker和Rabbit-mq服务器。奇怪的是,芹菜工人将任务报告为成功:

[2014-04-22 19:12:03,608: INFO/MainProcess] Task test_celery.add[168c7d96-e41a-41c9-80f5-50b24dcaff73] succeeded in 0.000435483998444s: 19 

为什么这不起作用?


34
作为Celery和RabbitMQ(或您想学习的任何库)的新用户,在遵循教程时看到错误并不能激发人们对软件质量的信心。简直令人沮丧。我想学习如何使用您的库,而不是其解决方法。
Diederik

Answers:


52

继续阅读教程。将在“保留结果”一章中进行说明。

要启动Celery,您只需要提供broker参数,这是发送有关任务的消息所必需的。如果要检索有关已完成任务的状态和结果的信息,则需要设置backend参数。您可以在“配置”文档中找到带有说明的完整列表:CELERY_RESULT_BACKEND


18
在学习本教程后,我没有遇到任何麻烦,但仍然遇到此错误,并且很难纠正它。我在一个Ubuntu终端窗口中运行Celery,而在第二个窗口中运行Python解释器。在第一个窗口中,我添加了backend ='rpc://'并重新启动了Celery。但是在第二个窗口中,Python没有意识到这一变化。在按Ctrl + d杀死Python,然后再次启动Python之后,它运行良好。
Steve Saporta

我得到一个带有您答案中最后一个链接的404。
Bryan Oakley

@BryanOakley我已经更新了链接。但是,Celery v4在此处更改了设置,因此请谨慎操作。
daniula

@SteveSaporta非常有帮助的评论!这个小细节应在文档中提及。
Kostas Demiris '17

这里的问题是,你不应该需要指定一个result_backend简单地返回一个AsyncResult实例。(这是由返回的.delay()。)result_backend仅应查看该结果的属性,例如.status
Brad Solomon


26

如果有人像我一样容易犯同样的错误:本教程没有这么明确地说,但是

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

所有教程都应该易于遵循,即使有些醉酒也是如此。到目前为止,这还没有达到那个标准。


2
好了,当您阅读本教程时,请记住,在编辑task.py之后,还必须从任务模块中重新导入add函数!基本上,尽管在add()中分配了正确的后端,但我一直收到此错误,直到我在控制台中退出Python(>>> quit()),回到它($ python)并从任务import add重新键入。
芬妮

同意,这是一个糟糕的教程。
user1288329 '19

2

本教程不清楚的是,需要编辑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

本教程令人困惑,因为我们假设应用程序对象的创建是在客户端测试会话中完成的,而事实并非如此。


这让我感到困惑。谢谢。
大卫

1

在项目目录中找到设置文件。

然后:sudo vim settings.py复制/粘贴到settings.py中:CELERY_RESULT_BACKEND ='djcelery.backends.database:DatabaseBackend'

注意:这是如果您使用django-celery作为将消息存储在队列中的后端。


拆卸时backend_result = RPC(即依赖于默认结果后端,这是没有的),然后反复调用result.ready我有这个问题()
AXD
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.