Ответ
GOMAXPROCS
— это переменная окружения и функция в пакете runtime
, которая определяет, сколько потоков операционной системы (ОС) могут одновременно исполнять код на Go.
Основная суть:
Планировщик Go использует модель M:P:G, где:
- M — поток ОС (OS Thread).
- P — "процессор", контекст для выполнения Go-кода.
- G — горутина (Goroutine).
GOMAXPROCS
ограничивает количество P (процессоров). Таким образом, если GOMAXPROCS=4
, то в любой момент времени не более четырех потоков ОС будут активно выполнять ваш Go-код.
Управление:
package main
import (
"fmt"
"runtime"
)
func main() {
// Получить текущее значение GOMAXPROCS
// По умолчанию равно количеству логических ядер ЦП
fmt.Printf("По умолчанию: %dn", runtime.GOMAXPROCS(0))
// Установить лимит в 2 потока
runtime.GOMAXPROCS(2)
fmt.Printf("Новое значение: %dn", runtime.GOMAXPROCS(0))
}
Ключевые моменты:
- Значение по умолчанию: Начиная с Go 1.5, значение по умолчанию равно количеству логических ядер ЦП. До этого оно было равно 1.
- Когда изменять: Для программ, интенсивно использующих ЦП (
CPU-bound
), значение по умолчанию почти всегда является оптимальным. ИзменениеGOMAXPROCS
может быть полезно для экспериментов или для искусственного ограничения потребления ресурсов. - Не влияет на I/O: Для программ, ограниченных вводом-выводом (
I/O-bound
), горутины, ожидающие I/O, не занимают P. Поэтому изменениеGOMAXPROCS
не окажет на них существенного влияния.