Можно ли заблокировать работника, накапливая запланированные задачи?

По коду:

@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 минут.

Разве рабочие не должны игнорировать запланированные задачи до тех пор, пока не придет время, и запускать те, которые просто отложены без времени?

Я не думаю или не знаю, как использовать периодические задачи является решением.


person Rafael Sierra    schedule 31.03.2013    source источник


Ответы (1)


См. пункты 5 и 6 здесь . Пожалуйста, имейте в виду, что countdown ничем не отличается от eta аргумента задачи.

Короче ты прав. Один работник (или любое количество работников) не должен блокировать запланированные задачи (eta или countdown).

Как узнать, что рабочие заблокированы? Запланированные задачи предварительно выбираются из очереди, но не подтверждаются до тех пор, пока они не будут выполнены.

Кроме того, имейте в виду, что все запланированные задачи хранятся в оперативной памяти до тех пор, пока они не будут выполнены. Вы хотите, чтобы они были как можно более легкими. Насколько я понимаю, запланированная задача не передает большие куски данных, возможно, только некоторые URI, так что это не должно быть проблемой.

Ссылки, которые вы вставили, возвращают ошибку 404. Вы уверены, что cheddar не является частным репозиторием?

person Krzysztof Szularz    schedule 25.07.2013
comment
Я изменил рабочий процесс своих задач и создал для них определенные очереди, с тех пор он работает нормально. Я знаю об обратном отсчете eta ==, я просто использую обратный отсчет, так как он имеет больше смысла в контексте. - person Rafael Sierra; 02.03.2015