Глядя на то, как на самом деле работает django-celery-beat
для установки расписаний, я подумал, что, возможно, смогу подключиться к этому процессу.
Это не происходит, когда запускается Django - это происходит, когда начинается beat .Он вызывает setup_schedule()
для класса, переданного в командной строке beat.
Поэтому мы можем просто переопределить планировщик с помощью
--scheduler=myproject.lib.scheduler:DatabaseSchedulerWithCleanup
, чтобы выполнить очистку:
import logging
from django_celery_beat.models import PeriodicTask
from django_celery_beat.models import PeriodicTasks
from django_celery_beat.schedulers import DatabaseScheduler
from django.db import transaction
class DatabaseSchedulerWithCleanup(DatabaseScheduler):
def setup_schedule(self):
schedule = self.app.conf.beat_schedule
with transaction.atomic():
num, info = PeriodicTask.objects.\
exclude(task__startswith='celery.').\
exclude(name__in=schedule.keys()).\
delete()
logging.info("Removed %d obsolete periodic tasks.", num)
if num > 0:
PeriodicTasks.update_changed()
super(DatabaseSchedulerWithCleanup, self).setup_schedule()
Обратите внимание, вы хотите это только в том случае, если вы исключительно управляете задачами с помощью beat_schedule
.Если вы добавляете задачи через администратора Django или программно, они также будут удалены.