Нет сообщений, отправляемых 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, который перехватывается и игнорируется, поэтому задача молча не добавляется в расписание.

Вернуться на верх