考えられる 1 つの方法は、タスクをデータベースに保存し、削除タスクを動的に追加することです。同じために、データベースでバックアップされたセロリビートスケジューラを使用できます。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()
enabled が False の場合、定期的なタスクはアイドル状態になります。にすることで再びアクティブにすることができますenable = True
。
タスクが不要になった場合は、単にエントリを削除できます。