Django + Celery в Heroku не выполняет асинхронную задачу

У меня есть Django + Celery в Heroku, а Celery настроен как:

import djcelery
djcelery.setup_loader()
BROKER_URL = "django://"  # tell kombu to use the Django database as the message queue
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
CELERY_RESULT_BACKEND = 'djcelery.backends.database:DatabaseBackend'
CELERY_ALWAYS_EAGER = False
CELERY_TIMEZONE = 'Europe/Madrid'

У меня есть 2 задачи, определенные в tasks.py, одна периодическая, а другая выполняется при асинхронных вызовах:

@task
def test_one_shot():
    print "One shot"

@periodic_task(run_every=crontab(minute="*/5"))
def test_periodic():
    print "Periodic"

Heroku настроен с основным веб-воркером и вспомогательным воркером:

web: gunicorn config.wsgi:application ON
worker: python manage.py celery worker -B -l info ON

При такой настройке я запускаю задачу test_one_shot следующим образом:

test_one_shot.apply_async(eta=datetime.now()+timedelta(minutes=2))

И хотя он выглядит как зарегистрированный в журналах heroku:

Received task: test.tasks.test_one_shot[f29c609d-b6e8-45d4-808d-2ca690f029af] eta:[2016-08-07 00:09:30.262362+02:00]

Он никогда не выполняется. С другой стороны, периодическая задача test_periodic выполняется должным образом. Что я делаю неправильно?

Спасибо!

РЕДАКТИРОВАТЬ: задача была выполнена и не отображалась в журналах из-за проблемы с датой и временем. Однако когда задача вызывается программно, она никогда не выполняется.


person kahlo    schedule 06.08.2016    source источник
comment
вам нужно его отладить. возможно, вы получаете ошибку внутри задачи, и она не отображает ошибки в асинхронных задачах.   -  person levi    schedule 07.08.2016
comment
@levi Как бы вы отладили это? Я уже тестирую функцию, которая является только оператором печати и просматриваю журналы heroku рабочего сельдерея (где ничего не появляется).   -  person kahlo    schedule 08.08.2016
comment
вот способ отладки задачи сельдерея docs.celeryproject.org/en/latest /tutorials/debugging.html   -  person levi    schedule 08.08.2016


Ответы (1)


В конечном итоге я меняю серверную часть сельдерея, чтобы использовать RabbitMQ в Heroku, следуя этому руководству, и проблема решена.

По сути, я установил RabbitMQ на Heroku:

$ heroku addons:add cloudamqp

И установите для него новую конфигурацию:

import djcelery
djcelery.setup_loader()
CELERY_TIMEZONE = 'Europe/Madrid'

BROKER_URL = env("CLOUDAMQP_URL", default="django://")
BROKER_POOL_LIMIT = 1
BROKER_CONNECTION_MAX_RETRIES = None

CELERY_TASK_SERIALIZER = "json"
CELERY_ACCEPT_CONTENT = ["json", "msgpack"]
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
CELERY_ALWAYS_EAGER = False

if BROKER_URL == "django://":
    INSTALLED_APPS += ("kombu.transport.django",)
person kahlo    schedule 09.08.2016