Один из возможных способов - сохранить задачи в базе данных и динамически добавлять задачи удаления.Для этого вы можете использовать планировщик ритмов сельдерея, поддерживаемый базой данных.См. https://django -celery-beat.readthedocs.io / en / latest / .База данных PeriodicTask хранит периодические задачи.Вы можете манипулировать периодической задачей с помощью команд базы данных (Django ORM).
Так я обрабатывал динамические задачи (динамически создавать и останавливать задачи).
from django_celery_beat.models import PeriodicTask, IntervalSchedule, CrontabSchedule
chon_schedule = CrontabSchedule.objects.create(minute='40', hour='08', day_of_week='*', day_of_month='*', month_of_year='*') # To create a cron schedule.
schedule = IntervalSchedule.objects.create(every=10, period=IntervalSchedule.SECONDS) # To create a schedule to run everu 10 min.
PeriodicTask.objects.create(crontab=chon_schedule, name='name_to_identify_task',task='name_of_task') # It creates a entry in the database describing that periodic task (With cron schedule).
task = PeriodicTask.objects.create(interval=schedule, name='run for every 10 min', task='for_each_ten_min', ) # It creates a periodic task with interval schedule
Всякий раз, когдапри обновлении PeriodicTask также увеличивается счетчик в этой таблице, который сообщает службе ритма сельдерея перезагружать расписание из базы данных.
Таким образом, вам не нужно перезапускать или уничтожать удар.Если вы хотите остановить задачу при выполнении определенных критериев, тогда
periodic_task = PeriodicTask.objects.get(name='run for every 10 min')
periodic_task.enabled = False
periodic_task.save()
Если включено значение False, периодическая задача становится бездействующей.Вы можете снова сделать его активным, сделав enable = True
.
Если вам больше не нужна задача, вы можете просто удалить запись.
При создании объекта модели проекта создайте также периодическую задачу.Просто создайте расписание cron или интервальное расписание на основе вашего сценарияЗатем создайте PeriodicTask
объект, который вы можете присвоить Project.name
имени PeriodicTask
(чтобы вы могли легко связать объект проекта с PeriodicTask
объектом. Таким образом, с этого момента задача будет обрабатываться с помощью удара сельдерея.
Если вы хотите динамически отключать или включать Периодическую задачу, просто установите флаг включения в PeriodicTask
следующим образом
task = PeriodicTask.objects.get(name='task_name')
task.enabled = False
task.save()