У меня есть 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
выполняется должным образом. Что я делаю неправильно?
Спасибо!
РЕДАКТИРОВАТЬ: задача была выполнена и не отображалась в журналах из-за проблемы с датой и временем. Однако когда задача вызывается программно, она никогда не выполняется.