Число потоков и горутины в 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".