Нет сообщений, отправляемых celery beat (при использовании django-celery-beat)
Я нахожусь в процессе обновления до celery 5.x для проекта Django. Поскольку аннотации @scheduled_task
больше нет, я изменил все аннотации на @shared_task
и написал код для создания экземпляров CrontabSchedule
и связывания с ними экземпляров PeriodicTask
для каждой задачи, которая должна выполняться по расписанию. Я вызываю это из приемника сигналов beat_init
. Я запускаю celery worker & beat как отдельные процессы.
Я записываю в журнал информацию из функции, которая устанавливает экземпляры CrontabSchedule
и PeriodicTask
, и вижу, что журнал выводится из процесса celery beat. Сразу же после этого я вижу сообщение DatabaseScheduler:
"Расписание изменено.". Это все, как ожидалось и хорошо.
После этого, однако, celery beat просто сидит и ничего не делает. beat никогда не посылает никаких сообщений, и в результате celery worker никогда не выполняет никаких запланированных задач.
В django-admin shell_plus
, PeriodicTask.objects.all()
показывает мне множество запланированных задач с расписаниями, которые выглядят так, как должны. Вот один пример из вывода, который должен выполняться раз в минуту, каждый день:
<PeriodicTask: dhnetwork.tasks.send_queued_mail: {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59} {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23} * {1,2,3,4,5,6,7,8,9,10,11,12} {0,1,2,3,4,5,6} (m/h/dM/MY/d) America/Los_Angeles>
Есть идеи, что я могу делать неправильно и/или как диагностировать проблему?
Я нашел проблему. Я создавал экземпляр crontab
для проверки значений и затем копировал значения из свойств экземпляра crontab
в поля экземпляра ``CrontabSchedule'', но свойства crontab
являются объектами set. При записи этих значений в строковые поля мы получаем в качестве значений repr
экземпляры set
, которые не являются валидными.
В методе all_as_schedule
в schedulers.py это приводит к ValueError
, который перехватывается и игнорируется, поэтому задача молча не добавляется в расписание.