1 含義
Go調度器(scheduler)用來決定Go例程最多可以在多少個線程上執行,在m:n調度機制裏面,GOMAXPROCS就是那個n。
2 默認值
操作系統CPU數
3 哪些任務不需要佔用線程
- sleeping的Go例程
- 由於通信阻塞的Go例程
4 哪些任務需要佔用線程
- 阻塞在I/O或其他系統調用的Go例程
- 調用非Go函數的例程,如CGO
- 一般的活躍Go例程
其中,前兩種任務雖然佔用線程,但並不計算在GOMAXPROCS內
5 如何修改
5.1 運行時指定環境變量
GOMAXPROCS=2 go run test.go
5.2 使用runtime.GOMAXPROCS函數
該函數將Go調度器可以同時使用的操作系統線程數設置爲指定值,並返回之前的值
func main() {
fmt.Println(runtime.GOMAXPROCS(2))
for {
go fmt.Print("0")
fmt.Print("1")
}
}
當GOMAXPROCS被設置爲1時,由於同時只能有一個Go例程被調度,因此上述程序會打印一段1,然後打印一段0,類似:
1111100000111110000
而如果GOMAXPROCS被設置爲大於1的值,則兩個Go例程會被同時調度,因此上述程序會交替打印1和0,類似:
1010101010