#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, за исключением того, что результат уже оценен.
То есть задачи будут выполняться локально, а не отправляться в очередь.