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