带 RabbitMQ 的芹菜: AttributeError: ‘ DisabledBackend’对象没有属性‘_get_task_meta_for’

我在运行 芹菜教程的第一步

我们确定了以下任务:

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'

我同时运行芹菜工人和 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

为什么不起作用?

43100 次浏览

只要继续阅读教程。它将在 保留成绩章解释。

要启动芹菜,您需要提供只是代理参数,这是发送关于任务的消息所必需的。如果要检索有关已完成任务返回的状态和结果的信息,则需要设置后端参数。您可以在 配置文档: CELERY _ REST _ BACKEND中找到带有描述的完整列表。

我建议看看: Http://www.cnblogs.com/fangwenyu/p/3625830.html

你会看到的 而不是

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

你应该写作

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

就是这里。

如果有人犯了和我一样容易犯的错误: 本教程没有明确说明,但行

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

所有的教程都应该易于遵循,即使有点醉了。到目前为止,这个还没有达到那个标准。

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

然后在终端运行以下命令:

sudo vim settings.py

将下面的配置复制/粘贴到 settings.py中:

CELERY_RESULT_BACKEND='djcelery.backends.database:DatabaseBackend'

注意: 如果您正在为 Django 项目使用 django-celery包,这是用于在队列中存储消息的后端。

本教程不清楚的是,需要编辑 tasks.py 模块,以便您更改行:

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

包括 RPC 结果后端:

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

一旦完成,Ctrl + C芹菜工人的过程,并重新启动它:

celery -A tasks worker --loglevel=info

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

我也遇到过同样的问题,解决这个问题的方法是在你的应用程序的 init 函数中导入芹菜文件(celery.py) ,比如:

from .celery import CELERY_APP as celery_app


__all__ = ('celery_app',)

如果使用 给你描述的 celery.py 文件

芹菜同时依赖后台和经纪人。 这解决了我只使用 Redis 的问题:

app = Celery("tasks", backend='redis://localhost',broker="redis://localhost")

请记住在更改配置后在终端中重新启动 worker

我的情况很简单——我使用了交互式 Python 控制台和 Python 缓存的导入模块。我关闭了控制台,并重新启动它-一切工作,因为它应该。

import celery




app = celery.Celery('tasks', broker='redis://localhost:6379',
backend='mongodb://localhost:27017/celery_tasks')


@app.task
def add(x, y):
return x + y

在 Python 控制台中。

>>> from tasks import add
>>> result = add.delay(4, 4)
>>> result.ready()
True