Ответ
GOMAXPROCS — это переменная окружения (или функция в пакете runtime), которая определяет максимальное количество потоков операционной системы (OS threads), которые могут одновременно исполнять код Go.
Ключевые моменты:
Современное поведение (Go 1.5+): По умолчанию
GOMAXPROCSравно количеству доступных логических ядер ЦП (runtime.NumCPU()). В большинстве случаев это оптимальное значение, и менять его вручную не требуется.Параллелизм, а не конкурентность:
GOMAXPROCSуправляет именно параллелизмом — реальным одновременным выполнением задач на разных ядрах процессора. Это не влияет на конкурентность — способность программы структурировать код для независимой работы над несколькими задачами (например, с помощью горутин).Когда это могло быть полезно?
- До Go 1.5: Значение по умолчанию было
1, и его почти всегда нужно было увеличивать для CPU-bound задач. - Современные нишевые случаи: Иногда его могут изменять в средах с неверно определенными лимитами CPU (некоторые старые версии Docker/Kubernetes) или для специфических бенчмарков, чтобы ограничить ресурсы.
- До Go 1.5: Значение по умолчанию было
Пример использования (для демонстрации, не для продакшена):
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 достаточно умен, чтобы эффективно использовать все доступные ядра.