Как в Go управлять количеством системных потоков (OS threads)?

Ответ

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

Это делается с помощью GOMAXPROCS. Планировщик Go использует модель M:N, где M горутин выполняются на N системных потоках.

GOMAXPROCS как раз и определяет это значение N.

Как установить:

  1. Переменная окружения (рекомендуется):
    export GOMAXPROCS=4
  2. В коде программы:

    import "runtime"
    
    func main() {
        // Установить количество потоков равным 4
        runtime.GOMAXPROCS(4)
    }

Важные моменты:

  • Значение по умолчанию: Начиная с Go 1.5, GOMAXPROCS по умолчанию равно количеству доступных ядер ЦП. В большинстве случаев это оптимальное значение.
  • Блокирующие системные вызовы: GOMAXPROCS не ограничивает потоки, которые создаются для обработки блокирующих системных вызовов (например, файловый ввод-вывод). Планировщик может создавать дополнительные потоки, чтобы другие горутины продолжали выполняться, пока одна из них заблокирована.
  • Когда изменять: Изменение значения по умолчанию требуется редко, в основном для тонкой настройки производительности в специфических сценариях (например, CPU-bound приложения на системах с очень большим количеством ядер) или для искусственного ограничения потребления ЦП.

Итог: Оставляйте значение по умолчанию, если нет веских причин его менять. Go отлично справляется с управлением потоками самостоятельно.