Celery与RabbitMQ:AttributeError:'DisabledBackend'对象没有'_get_task_meta_for'属性
我正在进行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中找到完整的参数列表和说明。