Ответ
Количество параллельных процессов для воркера Celery задается параметром concurrency. Это определяет, сколько задач воркер может выполнять одновременно.
Существует несколько способов его настройки:
-
Через флаг командной строки (самый частый способ): Используйте флаг
--concurrencyили его короткую версию-cпри запуске воркера.celery -A my_project worker --loglevel=info --concurrency=8 -
Через конфигурационный файл: Укажите значение в настройках Celery (например, в
celeryconfig.py).# celeryconfig.py worker_concurrency = 8 -
Через переменные окружения: 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 задач, а то комп взвоет, как сука, и накроется медным тазом.