2016-08-06 2 views
0

У меня есть Django + сельдерей в Heroku, и сельдерея настроен как:Джанго + Сельдерей в Heroku не выполняет асинхронную задачу

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 выполняется, как ожидалось. Что я делаю не так?

Спасибо!

EDIT: Выполнение задачи не появлялось в журналах из-за проблемы с датой времени. Однако, когда задача программно называется, она никогда не выполняется.

+0

вам нужно отладить. может быть, вы получаете ошибку внутри задачи, и она не будет показывать ошибки в задачах async. – levi

+0

@levi Как бы вы его отлаживали? Я уже тестирую функцию, которая является только заявлением на печать и непосредственно смотрит на журналы героику работника сельдерея (где ничего не появляется). – kahlo

+0

вот способ отладки задачи сельдерея http://docs.celeryproject.org/en/latest/tutorials/debugging.html – levi

ответ

0

Я в конечном итоге меняю фермент сельдерея на использование RabbitMQ в Heroku после this guide, и проблема решена.

В принципе, я установил 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",)