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

时间:2014-04-22 09:15:31

标签: python celery

我正在运行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 

为什么这不起作用?

7 个答案:

答案 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