芹菜任务延迟导致的Keyerror

时间:2019-11-07 17:47:58

标签: django celery

celery getting started with Django instructions之后,我能够运行任务,但不能使用delay()异步运行同一任务。

我在Django项目中添加了以下要求:

celery==4.3.0
redis==3.3.11
django-celery-results==1.1.2
psycopg2==2.7.3.1
django-cors-headers~=3.1.0

在pop_model项目目录中创建了这个celery.py:

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'pop_model.settings.local')

app = Celery('pop_model')

# namespace='CELERY' means all celery-related configuration keys
# should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')

# Load task modules from all registered Django app configs.
app.autodiscover_tasks()


@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))

将此代码插入项目 init .py:

from __future__ import absolute_import, unicode_literals

# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app

__all__ = ('celery_app',)

在项目设置中配置了cors并添加了以下设置:

CELERY_BROKER_URL = 'redis://localhost:6379'
CELERY_RESULT_BACKEND = 'django-db' # defined in django_celery_results

CELERY_ACCEPT_CONTENT = ['json']
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TASK_SERIALIZER = 'json'

我可以启动redis,然后使用以下命令运行celery:

export DJANGO_SETTINGS_MODULE=pop_model.settings.local
celery worker -A pop_model --loglevel=info

在python3 shell中,我得到了以下结果:

>>> from pop_model.celery import debug_task
>>> debug_task()
Request: <Context: {'args': (), 'kwargs': {}}>
>>> task=debug_task.delay()
Traceback (most recent call last):
  File "/Users/janee/.virtualenvs/pop-model/lib/python3.6/site-packages/kombu/utils/objects.py", line 42, in __get__
    return obj.__dict__[self.__name__]
KeyError: 'backend'

我不知道如何解决丢失的backend键,因为在设置文件中定义了CELERY_RESULT_BACKEND。

1 个答案:

答案 0 :(得分:2)

普通Python shell和manage.py shell之间的唯一区别是,它会在DJANGO_SETTINGS_MODULE环境变量中导出设置模块(project_name.settings)。

如果使用正确的环境变量运行相同的解释器,则应该看不到任何更改。然后,可能是您的pop_model.settings.local路径未返回适当的设置模块供您的应用程序锁定,或者您使用的是经过修改的manage.py脚本(我想是为了分离开发环境),其中设置模块已正确加载。

您应该可以使用来调用函数

./manage.py shell
在您的项目目录中使用相同的虚拟环境解释器

。这也可能起作用,因为DJANGO_SETTINGS_MODULE需要解释器的搜索路径中存在的路径(有关here的更多信息),并且您可能正在从另一个目录调用解释器。