Расписание получено из настройки и, таким образом, кажется неизменным во время выполнения.
Вы, вероятно, можете выполнить то, что ищете, используя ETA задания .Это гарантирует, что ваша задача не будет запущена до требуемого времени, но не обещает запустить задачу в назначенное время - если рабочие будут перегружены в назначенное ETA, задача может быть запущена позже.
Если это ограничение не является проблемой, вы можете написать задачу, которая сначала запустится сама, например:
@task
def mytask():
keep_running = # Boolean, should the task keep running?
if keep_running:
run_again = # calculate when to run again
mytask.apply_async(eta=run_again)
# ... do the stuff you came here to do ...
Основным недостатком этого подхода является то, что вы полагаетесь на хранилище задачзапомнить задачи в полете.Если один из них завершится неудачей, прежде чем запустить следующий, задание больше никогда не запустится.Если ваш брокер не был сохранен на диске и умирает (принимая с собой все выполняемые в полете задачи), то ни одна из этих задач не запустится снова.
Вы можете решить эти проблемы с помощью некоторого рода регистрации транзакций ипериодическая задача «няни», работа которой состоит в том, чтобы найти такие повторяющиеся задачи, которые умерли безвременной смертью и оживить их.
Если бы мне пришлось реализовать то, что вы описали, я думаю, что именно так я бы к этому подошел.