Для независимых CPU-bound задач число одновременно работающих исполнителей часто начинают подбирать около текущего GOMAXPROCS. Для I/O-bound конкурентных операций может быть больше, но лимит задают соединения, память, квоты и возможности внешней системы. Универсального множителя нет: используют ограниченный пул и измеряют задержки, пропускную способность и ошибки.
Сколько горутин создавать для CPU-bound и I/O-bound задач?
Почему GOMAXPROCS — ориентир для вычислений, но не предел числа горутин. Ограничение внешних ресурсов, очередь и измерение производительности.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Не путайте количество созданных горутин с количеством вычислений, реально выполняемых одновременно.
CPU-bound. Если каждая задача постоянно считает, полезный параллелизм ограничен доступным процессором и настройкой GOMAXPROCS. Начальная гипотеза — около этого количества исполнителей, затем измерение. Дополнительные горутины могут помогать балансировать разные по длительности задачи, но сами не создают процессорную мощность; конкуренция за память и кеши способна ухудшить результат.
GOMAXPROCS — не всегда число всех логических CPU машины. Настройки, доступность CPU и в актуальных версиях ограничения контейнера влияют на значение; см. документацию runtime. Для чтения текущего значения используют runtime.GOMAXPROCS(0).
I/O-bound. Пока часть операций ждёт сеть или диск, другие могут работать. Но запуск неограниченного числа горутин способен исчерпать память, пул соединений или лимиты сервиса. Ограничивают конкурентность пулом либо семафором, добавляют очередь с пределом, отмену и тайм-ауты.
Настройку проверяют на характерной нагрузке: измеряют throughput, p95/p99 задержки, ошибки, длину очереди, память и число активных соединений. Если увеличение конкурентности повышает только ожидание и ошибки, полезный предел уже пройден.
Для смешанной нагрузки этапы вычисления и I/O иногда разделяют и ограничивают независимо.