Celery снова и снова выполняет давно выполняемые задачи.

У меня есть очередь python celery-redis, обрабатывающая загрузки и выгрузки на гигабайты данных за раз.

Некоторые загрузки занимают до нескольких часов. Однако как только такая задача завершается, я становлюсь свидетелем этого странного поведения сельдерея, когда планировщик сельдерея повторно запускает только что завершенную задачу, снова отправляя ее рабочему (у меня один рабочий). И это произошло 2 раза на одном и том же задача!

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

Задачи определенно завершаются чисто, без сообщений об ошибках, просто это чрезвычайно длительные задачи.


person user2252999    schedule 05.12.2014    source источник
comment
Попробуйте использовать цветок, чтобы узнать, что происходит в вашей очереди сельдерея.   -  person lunixbochs    schedule 05.12.2014
comment
Я вижу кучу задач в очереди, но не более того. Есть ли что-нибудь конкретное, на что мне нужно обратить внимание?   -  person user2252999    schedule 05.12.2014
comment
@avinash, не могли бы вы подробнее рассказать?   -  person user2252999    schedule 05.12.2014
comment
@avinash Пожалуйста, воздержитесь от публикации неполных ответов, которые ни к чему не приведут.   -  person user2252999    schedule 05.12.2014


Ответы (1)


Недавно я столкнулся с этой проблемой и в конце концов выяснил, что задачи выполнялись несколько раз из-за комбинации предварительная выборка задач и задачи превысили тайм-аут видимости. Задачи подтверждаются прямо перед их выполнением (если вы не установили ACKS_LATE = True), и по умолчанию для каждого процесса предварительно выбираются 4 задачи. Первая задача будет подтверждена перед выполнением, но если для ее выполнения потребуется более часа, то другие предварительно выбранные задачи будут доставлены другому исполнителю, где она будет выполнена в дополнительное время (или, в вашем случае, выполнено в дополнительное время тем же рабочий).

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

BROKER_TRANSPORT_OPTIONS = {'visibility_timeout': 3600*10}  # 10 hours

Вы также можете установить PREFETCH_MULTIPLIER=1, чтобы отключить предварительную выборку, чтобы длительные задачи не препятствовали подтверждению других задач.

person Jason V.    schedule 26.04.2016