GOMAXPROCS含義與用法

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章