Celery + rabbitmq结果后端

时间:2014-10-13 06:46:07

标签: python rabbitmq celery

tasks.py:

from celery import Celery

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

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

call.py:

from tasks import add

result = add.delay(1, 4)

result.ready()

celeryconfig.py:(在同一目录中)

BROKER_URL = 'amqp://guest@localhost//'

CELERY_RESULT_BACKEND = 'amqp://guest@localhost//'

CELERY_TASK_SERIALIZER = 'json'

CELERY_RESULT_SERIALIZER = 'json'

CELERY_ACCEPT_CONTENT=['json']

CELERY_TIMEZONE = 'Europe/Oslo'

CELERY_ENABLE_UTC = True

call.py 中我遇到了错误:

  

AttributeError:'DisabledBackend'对象没有属性   '_get_task_meta_for'

我阅读了文档,我有结果后端,为什么它不起作用?如何解决?

谢谢!

2 个答案:

答案 0 :(得分:4)

您不应将Celery('tasks', broker='amqp://guest@localhost//')与celeryconfig.py文件一起使用。

您应该采用的方式(以及文档的方式)是:

创建一个名为 mypackage 的包(假设mypackage不是子包),包含两个文件:

<强> celery.py

from __future__ import absolute_import

from celery import Celery

app = Celery('mypackage',
             broker='amqp://guest@localhost//',
             backend='amqp://guest@localhost//',
             include=['mypackage.tasks'] #References your tasks. Donc forget to put the whole absolute path.
             )

app.conf.update(
        CELERY_TASK_SERIALIZER = 'json',
        CELERY_RESULT_SERIALIZER = 'json',
        CELERY_ACCEPT_CONTENT=['json'],
        CELERY_TIMEZONE = 'Europe/Oslo',
        CELERY_ENABLE_UTC = True
                )

<强> tasks.py

from mypackage.celery import app
@app.task
def add(x, y):
    return x + y

你的call.py文件很好。

在命令行中使用celery -A mypackage worker mypackage 的父目录中启动Celery worker。

然后你可以启动另一个Python解释器,使用call.py和voila!

答案 1 :(得分:-2)

我在代码中发现了一个错误。 在 tasks.py

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

需要后端参数。