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

92 投票
12 回答
51196 浏览
提问于 2025-04-18 03:43

我正在进行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工作进程和rabbit-mq服务器。奇怪的是,celery工作进程报告任务成功:

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

为什么这不管用呢?

12 个回答

3

在你的项目文件夹里找到设置文件。

然后在你的终端中运行下面的命令:

sudo vim settings.py

把下面的配置复制粘贴到你的 settings.py 文件里:

CELERY_RESULT_BACKEND='djcelery.backends.database:DatabaseBackend'

注意:如果你在Django项目中使用了 django-celery 这个包,这个配置是用来存储消息队列的后端。

7

这个教程中不太清楚的一点是,tasks.py这个模块需要被修改,你需要把这一行:

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

改成包含RPC结果后端的内容:

app = Celery('tasks', backend='rpc://', broker='pyamqp://')

完成后,按下Ctrl + C来停止celery工作进程,然后重新启动它:

celery -A tasks worker --loglevel=info

这个教程让人困惑的地方在于,我们假设应用对象是在客户端测试时创建的,但实际上并不是这样。

27

如果有人和我一样犯了这个简单的错误:教程没有明确说明,但这一行

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

所有的教程都应该简单易懂,即使在喝了点酒的情况下也能跟得上。所以到目前为止,这个教程还达不到这个标准。

48

我建议你去看看这个链接:

http://www.cnblogs.com/fangwenyu/p/3625830.html

在那儿你会看到,

不要使用

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

而应该写成

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

就是这样。

65

继续阅读教程吧。在保持结果这一章会有详细解释。

要启动Celery,你只需要提供一个叫做broker的参数,这个参数是用来发送任务消息的。如果你想获取已完成任务的状态和结果信息,就需要设置backend参数。你可以在配置文档:CELERY_RESULT_BACKEND中找到完整的参数列表和说明。

撰写回答