Django中的芹菜任务总是阻塞

时间:2014-06-19 14:36:45

标签: python django celery django-celery

我的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,该函数实际执行操作但看起来不是异步。我错过了什么?

1 个答案:

答案 0 :(得分:0)

似乎CELERY_ALWAYS_EAGER会导致此

  

如果这是True,则所有任务将通过阻塞直到本地执行   任务返回。 apply_async()和Task.delay()将返回一个   EagerResult实例,它模拟API和行为   AsyncResult,但结果已被评估。

     

也就是说,任务将在本地执行而不是发送给   队列中。