Как задать количество параллельных процессов для воркера в Celery

Ответ

Количество параллельных процессов для воркера Celery задается параметром concurrency. Это определяет, сколько задач воркер может выполнять одновременно.

Существует несколько способов его настройки:

  1. Через флаг командной строки (самый частый способ): Используйте флаг --concurrency или его короткую версию -c при запуске воркера.

    celery -A my_project worker --loglevel=info --concurrency=8
  2. Через конфигурационный файл: Укажите значение в настройках Celery (например, в celeryconfig.py).

    # celeryconfig.py
    worker_concurrency = 8
  3. Через переменные окружения: Celery может считывать некоторые настройки из переменных окружения.

    export CELERY_WORKER_CONCURRENCY=8
    celery -A my_project worker --loglevel=info

Рекомендации по выбору значения

  • CPU-bound задачи (интенсивные вычисления): concurrency должно быть равно количеству ядер CPU на машине.
  • I/O-bound задачи (сетевые запросы, работа с файлами/БД): concurrency можно ставить значительно выше количества ядер (например, 16, 32, 100+), так как процессы будут часто простаивать в ожидании ответа. В этом случае также рекомендуется использовать пулы на основе gevent или eventlet (--pool=gevent) для более эффективной работы с I/O.

Ответ 18+ 🔞

А, слушай, про эти ваши Celery воркеры! Ну, смотри, чтобы эта мартышлюшка не сидела без дела, ей надо сказать, сколько рук-ног у неё есть для работы. Это вот параметр concurrency. Сколько процессов она может запустить одновременно, чтобы всё не в одну дырку лезло.

Задать это можно по-разному, главное — не накосячить.

Первый способ, самый простой — прямо в командной строке крикнуть. Ты просто пишешь --concurrency или -c и число. Всё, пиздец, готово.

celery -A my_project worker --loglevel=info --concurrency=8

Второй способ — для аккуратных. Через конфиг. Ты залезаешь в свой celeryconfig.py и пишешь там строчку, как в учебнике. Чисто, красиво, никакого крика.

# celeryconfig.py
worker_concurrency = 8

Третий способ — через переменные окружения. Для тех, кто любит всё через систему настраивать. Выставил переменную — и забыл.

export CELERY_WORKER_CONCURRENCY=8
celery -A my_project worker --loglevel=info

А теперь, блядь, главное — какое число вписать?

Тут надо думать головой, а не жопой.

  • Если задачи — CPU-bound. То есть твой воркер нихрена не ждёт, а тупо долбит процессор вычислениями. Тогда ставь concurrency ровно по количеству ядер на твоей машине. Больше — будет только хуже, они начнут драться за ресурсы, как пиздатые в очереди за халявой.
  • Если задачи — I/O-bound. А это 90% всех случаев: запросы куда-то, чтение из базы, файлы, API. Тут процессы большую часть времени просто спят, ждут ответа. Вот тогда можно дать овердохуища параллельных процессов! 16, 32, 100 — смотря сколько памяти есть. А ещё лучше — использовать пулы на gevent или eventlet (--pool=gevent). Это как дать воркеру не несколько рук, а одну, но которая двигается с такой скоростью, что создаёт иллюзию, будто рук сто. Эффективность, блядь, зашкаливает!

Вот и вся магия. Главное — не поставь 100 процессов для CPU-bound задач, а то комп взвоет, как сука, и накроется медным тазом.