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'
我阅读了文档,我有结果后端,为什么它不起作用?如何解决?
谢谢!
答案 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')
需要后端参数。