我的django设置中有以下设置:
CELERY_TASK_RESULT_EXPIRES = timedelta(minutes=30)
CELERY_CHORD_PROPAGATES = True
CELERY_ACCEPT_CONTENT = ['json', 'msgpack', 'yaml']
CELERY_ALWAYS_EAGER = True
CELERY_EAGER_PROPAGATES_EXCEPTIONS = True
BROKER_URL = 'django://'
CELERY_RESULT_BACKEND='djcelery.backends.database:DatabaseBackend'
我已在我已安装的应用程序中包含此内容:
'djcelery',
'kombu.transport.django'
我的项目结构是(django 1.5)
proj
|_proj
__init__.py
celery.py
|_apps
|_myapp1
|_models.py
|_tasks.py
这是我的celery.py
文件:
from __future__ import absolute_import
import os
from celery import Celery
from django.conf import settings
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings.dev')
app = Celery('proj')
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS, related_name='tasks')
在主__init__.py
我有:
from __future__ import absolute_import
from .celery import app as celery_app
最后在 myapp1 / tasks.py 中我定义了我的任务:
@task()
def retrieve():
# Do my stuff
现在,如果我启动django交互式shell并启动retrieve
任务:
result = retrieve.delay()
它似乎总是一个阻塞调用,这意味着在函数返回之前,提示会被填充。 result
状态为SUCCESS,该函数实际执行操作但看起来不是异步。我错过了什么?
答案 0 :(得分:0)
似乎CELERY_ALWAYS_EAGER会导致此
如果这是True,则所有任务将通过阻塞直到本地执行 任务返回。 apply_async()和Task.delay()将返回一个 EagerResult实例,它模拟API和行为 AsyncResult,但结果已被评估。
也就是说,任务将在本地执行而不是发送给 队列中。