Celery与SQLite: AttributeError: 'DisabledBackend'对象没有'_get_task_meta_for'属性

1 投票
1 回答
5756 浏览
提问于 2025-04-18 08:33

我想学习celery这个项目,但我不知道我哪里出错了。

这是'tasks.py'文件:

# -*- coding: utf-8 -*-
from celery import Celery

app = Celery('tasks', broker='sqla+sqlite:///celerydb.sqlite')
app.conf.update(
    CELERY_RESULT_BACKEND = 'db+sqlite:///results.sqlite',
#   CELERY_RESULT_BACKEND = 'redis://localhost/0',
#   CELERY_RESULT_BACKEND = 'amqp',
#   CELERY_RESULT_BACKEND = 'mongodb://127.0.0.1:27017/',
    CELERY_TASK_SERIALIZER = 'json',
    CELERY_IGNORE_RESULT = False,
    )

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

@app.task(trail=True)
def mul(x, y):
    return x * y

@app.task(trail=True)
def xsum(numbers):
    return sum(numbers)

然后我这样运行celery服务:

celery -A tasks worker --loglevel=info  

它运行得很好。

接着我用ipython来运行流程脚本:

In [127]: result = add.delay(3,5)
In [128]: result.result

出现了这样的错误:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-128-a030fb181312> in <module>()
----> 1 result.result

/home/xingming/pyvirt/local/lib/python2.7/site-packages/celery/result.pyc in result(self)
    350         If the task raised an exception, this will be the exception
    351         instance."""
--> 352         return self._get_task_meta()['result']
    353     info = result
    354 

/home/xingming/pyvirt/local/lib/python2.7/site-packages/celery/result.pyc in _get_task_meta(self)
    326     def _get_task_meta(self):
    327         if self._cache is None:
--> 328             meta = self.backend.get_task_meta(self.id)
    329             if meta:
    330                 state = meta['status']

/home/xingming/pyvirt/local/lib/python2.7/site-packages/celery/backends/base.pyc in get_task_meta(self, task_id, cache)
    292                 pass
    293 
--> 294         meta = self._get_task_meta_for(task_id)
    295         if cache and meta.get('status') == states.SUCCESS:
    296             self._cache[task_id] = meta

AttributeError: 'DisabledBackend' object has no attribute '_get_task_meta_for'

但是celery服务运行得很好:

[2014-06-04 11:17:31,656: INFO/MainProcess] Received task: tasks.add[11baa65f-4e18-44b1-80e4-9e81626ca42a]
[2014-06-04 11:17:31,658: INFO/MainProcess] Task tasks.add[11baa65f-4e18-44b1-80e4-9e81626ca42a] succeeded in 0.00117350020446s: 8

这到底是怎么回事呢?

谢谢你的帮助!

1 个回答

1

你并没有犯错。Celery 的文档对此有详细说明:默认情况下,用来存储任务结果的后端是没有启用的,所以你不能使用任何依赖它的功能。如果你想使用这些功能,你需要按照文档的说明来配置一个后端。

撰写回答