За что отвечает переменная окружения GOMAXPROCS в Go и нужно ли ее менять?

Ответ

GOMAXPROCS — это переменная окружения (или функция в пакете runtime), которая определяет максимальное количество потоков операционной системы (OS threads), которые могут одновременно исполнять код Go.

Ключевые моменты:


  1. Современное поведение (Go 1.5+): По умолчанию GOMAXPROCS равно количеству доступных логических ядер ЦП (runtime.NumCPU()). В большинстве случаев это оптимальное значение, и менять его вручную не требуется.



  2. Параллелизм, а не конкурентность: GOMAXPROCS управляет именно параллелизмом — реальным одновременным выполнением задач на разных ядрах процессора. Это не влияет на конкурентность — способность программы структурировать код для независимой работы над несколькими задачами (например, с помощью горутин).


  3. Когда это могло быть полезно?

    • До Go 1.5: Значение по умолчанию было 1, и его почти всегда нужно было увеличивать для CPU-bound задач.
    • Современные нишевые случаи: Иногда его могут изменять в средах с неверно определенными лимитами CPU (некоторые старые версии Docker/Kubernetes) или для специфических бенчмарков, чтобы ограничить ресурсы.

Пример использования (для демонстрации, не для продакшена):

package main

import (
    "fmt"
    "runtime"
)

func main() {
    // Получаем текущее значение (обычно равно кол-ву ядер)
    fmt.Printf("Default GOMAXPROCS: %dn", runtime.GOMAXPROCS(0))

    // Устанавливаем новое значение
    runtime.GOMAXPROCS(2)

    // Проверяем, что значение изменилось
    fmt.Printf("New GOMAXPROCS: %dn", runtime.GOMAXPROCS(0))
}

Вывод: В современной разработке на Go изменять GOMAXPROCS — это антипаттерн для 99% случаев. Планировщик Go достаточно умен, чтобы эффективно использовать все доступные ядра.