Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗goSpGrGp 154 of 280 menu
◀ ▶

Число потоков и горутины в Go

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

Настройку читают и меняют через runtime.GOMAXPROCS. Нулевой аргумент только возвращает текущее значение, не меняя его. По умолчанию оно равно числу логических процессоров машины.

Узнаем текущий предел:

package main import ( "fmt" "runtime" ) func main() { n := runtime.GOMAXPROCS(0) fmt.Println("procs", n) }

Число на экране показывает, сколько потоков рантайм готов держать занятыми кодом Go одновременно. Оно не считает созданные горутины.

Запустим много веток при том же пределе:

package main import ( "fmt" "runtime" "sync" ) func main() { fmt.Println("limit", runtime.GOMAXPROCS(0)) var wg sync.WaitGroup wg.Add(100) for i := 0; i < 100; i++ { go func() { defer wg.Done() }() } wg.Wait() fmt.Println("finished") }

Дан следующий код:

limit := runtime.GOMAXPROCS(0)

Скажите, что хранит limit: число горутин или число потоков исполнения.

Скажите, изменится ли счетчик горутин в программе, если ограничить число потоков исполнения до 1 через runtime.GOMAXPROCS.

Скажите, зачем в учебном примере со 100 ветками все равно нужна группа ожидания перед печатью "finished".

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить