Celery Beat отправляет все периодические задачи как подлежащие выполнению при перезапуске, даже если они только что были выполнены

Я запускаю celery worker и celery beat с DatabaseScheduler.

Я запускаю их на Heroku вместе с веб-приложением django. Они используются для отправки электронных писем и текстов через регулярные промежутки времени, один раз в день в полночь для электронных писем и в 730 утра для текстов.

Я определил задачи вручную, используя chrontab в таблице Periodic Tasks, но я также попробовал определить их в кодовой базе, используя celeryapp.conf.beat_schedule, оба ведут себя одинаково.

Задания выглядят следующим образом

периодические задачи в админке django

Проблема, с которой я столкнулся, заключается в том, что Heroku перезапускает свои дино раз в день в соответствии с политикой, и когда это происходит, дино celery beat по какой-то причине запускает мои периодические задачи. В журнале отладки написано "Планировщик: Sending due task", как будто это нормально, независимо от того, наступило ли время их выполнения или нет. Я не знаю, почему это происходит

У меня также запущены результаты celery с результатами задач в postgres, и это выглядит следующим образом, где у меня есть задачи, запущенные в правильное время (полночь и 730 утра), но также в некоторое случайное время, когда heroku перезапускает dynos.

Как я могу остановить выполнение задач, когда происходит перезапуск? Почему они вообще запускаются после перезапуска?

результаты задачи в админке django

Хотя я не проверил точную причину, я думаю, что нашел решение, так как сегодня это не повторилось, я обновлю, если это не будет исправлено. Если beat не видит last_run_at, он использует datetime.now(). Я полагаю, что каким-то образом расчет (last run + delta - now) возвращался отрицательным, заставляя его запускаться в начале.

Я заметил настройку в коде ритма под названием "DJANGO_CELERY_BEAT_TZ_AWARE", которая у меня не была установлена. Я также думаю, что в моих настройках была ошибка с USE_TZ false.

У меня настройки сельдерея сопоставлены с "CELERY_", и это было до и после в settings.py:

Перед:

CELERY_ENABLE_UTC = False
TIME_ZONE = "America/New_York"
CELERY_TIMEZONE = "America/New_York"
USE_TZ = False 

После (больше не происходит):

CELERY_ENABLE_UTC = False
CELERY_TIMEZONE = "America/New_York"
DJANGO_CELERY_BEAT_TZ_AWARE = True
TIME_ZONE = "America/New_York"
USE_TZ = True
Вернуться на верх