Что такое GOMAXPROCS и как с его помощью управлять параллелизмом в Go?

Ответ

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 не окажет на них существенного влияния.