По коду:
@celery.task()
def some_recursive_task():
# Do some stuff and schedule it to run again later
# Note that the next run is not scheduled in a fixed basis, like crontabs
# but based on history of some object
# Actual task is found here:
# https://github.com/rafaelsierra/cheddar/blob/master/src/feeds/tasks.py#L39
# Then it call himself again
countdown = bla.get_countdown()
some_recursive_task.apply_async(countdown=countdown)
Эта задача будет выполняться в течение следующих 10 минут и 12 часов, но эта задача также вызывает другие задачи, которые должны быть запущены сейчас, один для загрузки материалов и другие для анализа.
Проблема в том, что основная функция вызывается для каждой отдельной записи в базе данных, давайте предположим, что выполняется несколько сотен задач, но, учитывая, что эти задачи выполняются в среднем каждые несколько часов, количество задач не имеет большого значения.
Проблема начинается, когда я пытаюсь запустить это с одним рабочим, когда я запускаю рабочего, я помещаю его для запуска всех очередей и устанавливаю 8 одновременных рабочих, затем он начинает подтверждать задачи, но кажется, что неважно насколько далеко в будущем поставлена задача, рабочий получит ее и будет ждать запланированного запуска, что означает, что этот рабочий процесс заблокирован до этого момента.
Я знаю, что могу просто разделить две другие функции на разные очереди, что я уже сделал, но меня беспокоит то, что рабочие процессы будут подтверждать выполнение задач на 12 часов вперед и не будут запускать те, которые должны выполняться через 30 минут.
Разве рабочие не должны игнорировать запланированные задачи до тех пор, пока не придет время, и запускать те, которые просто отложены без времени?
Я не думаю или не знаю, как использовать периодические задачи а> является решением.