Задачи сельдерея в Django всегда блокируются

#python #django #celery #django-celery

#python #django #сельдерей #django-сельдерей

Вопрос:

У меня есть следующие настройки в настройках 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 и запускаю retrieve задачу:

 result = retrieve.delay()
  

кажется, что это всегда блокирующий вызов, что означает, что приглашение блокируется до тех пор, пока функция не вернется. result Статус — SUCCESS, функция фактически выполняет операции, но, похоже, она не является асинхронной. Чего мне не хватает?

Комментарии:

1. похоже, что ALWAYS_EAGER вызывает этоhttp://celery.readthedocs.org/ru/latest/configuration.html#сельдерей-всегда-нетерпеливый

2. Вы запускаете рабочий celery?

3.@pynovice да, он запущен, но я не вижу никаких сообщений. Я выполнил это либо с celery -A proj worker -l info python manage.py celery worker --loglevel=info помощью, либо python manage.py celeryd результат не изменился

4. @dm03514 кажется, вы правы, так оно и было, не могли бы вы опубликовать ответ?

Ответ №1:

похоже, что CELERY_ALWAYS_EAGER вызывает это

если это верно, все задачи будут выполняться локально путем блокировки до тех пор, пока задача не вернется. apply_async() и Task.delay() вернут экземпляр EagerResult, который эмулирует API и поведение AsyncResult, за исключением того, что результат уже оценен.

То есть задачи будут выполняться локально, а не отправляться в очередь.