Go
语言的运行时系统使用了自己的调度器,该调度器使用了M:N
模型,即M个goroutine
可以在N个操作系统上进行调度。我们可以通过设置环境变量GOMAXPROCS
或者使用runtime
包中的GOMAXPROCS
函数来限制Go
程序可以使用的操作系统数。默认情况下,GOMAXPROCESS
的值为系统的CPU
核数。
go
package main
import (
"fmt"
"runtime"
"sync"
)
func main() {
// 设置最大可用的 CPU 核心数为 2
runtime.GOMAXPROCS(2)
// 使用 WaitGroup 等待两个 goroutine 完成
var wg sync.WaitGroup
wg.Add(2)
go func() {
defer wg.Done()
for i := 1; i <= 5; i++ {
fmt.Println("A", i)
}
}()
go func() {
defer wg.Done()
for i := 1; i <= 5; i++ {
fmt.Println("B", i)
}
}()
// 等待所有 goroutine 完成
wg.Wait()
}
虽然GOMAXPROCS
可以限制Go
程序可以使用的操作系统线程数量,但最好不要轻易设置这个值,因为正常情况下,Go
会自己觉得使用的线程数以保证运行时最高的效率和性能。
而在实际应用中,GOMAXPROCS
往往使用于一个CPU
核数非常多而且都处于高负载的机器上,防止CPU
过度竞争。
最后给大家推荐一个LinuxC/C++高级架构系统教程的学习资源与课程,可以帮助你有方向、更细致地学习C/C++后端开发,具体内容请见 https://xxetb.xetslk.com/s/1o04uB