Выбор ответа Senior Celery и очереди обновлено

Prefetch и долгие задачи

Вопрос

Воркер с concurrency 4 обрабатывает задачи по 10 минут. Другие воркеры простаивают, а у этого очередь задач. Что настроить?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: workerprefetchmultiplier=1 и ackslate, чтобы не брать задачи впрок. По умолчанию воркер забирает из брокера задачи с запасом (prefetch multiplier 4 на каждый процесс), чтобы не простаивать на коротких задачах.

Варианты ответа

  1. Увеличить worker_prefetch_multiplier до 100, чтобы воркеры брали больше
  2. Отключить брокер и запускать задачи напрямую через HTTP между воркерами
  3. Перейти на пул solo, чтобы каждый воркер выполнял одну задачу за раз
  4. worker_prefetch_multiplier=1 и acks_late, чтобы не брать задачи впрокправильный ответ

Разбор

По умолчанию воркер забирает из брокера задачи с запасом (prefetch multiplier 4 на каждый процесс), чтобы не простаивать на коротких задачах. С долгими задачами это ведёт к перекосу: зарезервированные задачи ждут у занятого воркера. Multiplier 1 вместе с acks_late заставляет брать задачу только когда процесс свободен. Пул solo выполняет по одной задаче на воркер и проблему не решает.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.