golang多核设置
更新时间:2023-10-15多核设置概述
多核处理器已经成为现代计算机的标准配置,但是在默认情况下,Golang并不会直接使用多核,为了充分利用多核处理器的性能,需要进行一些设置。
GOMAXPROCS
GOMAXPROCS是Golang中用于设置最大进程数的环境变量,通过设置该变量,可以充分利用多核处理器。
import ( "fmt" "runtime" ) func main() { n := runtime.NumCPU() // 获取CPU核心数 runtime.GOMAXPROCS(n) // 设置最多使用n个核心 fmt.Println("核心数:", n) }
多线程与多进程
在Golang中,使用goroutine来实现并发操作,而goroutine会被映射到操作系统线程上进行执行,因此Golang的并发模型是基于协程的,而不是进程。
为了更好地理解goroutine和线程的关系,可以通过以下示例进行实验:
import ( "fmt" "runtime" "sync" ) func main() { runtime.GOMAXPROCS(1) // 只使用一个核心 var wg sync.WaitGroup wg.Add(2) fmt.Println("创建goroutine前:", runtime.NumGoroutine()) // 输出当前goroutine数 go func() { defer wg.Done() for i := 0; i < 10; i++ { fmt.Printf("A%d ", i) } }() go func() { defer wg.Done() for i := 0; i < 10; i++ { fmt.Printf("B%d ", i) } }() fmt.Println("创建goroutine后:", runtime.NumGoroutine()) // 输出当前goroutine数 wg.Wait() }
在该示例中,我们通过设置GOMAXPROCS为1,只使用一个核心来执行goroutine,而在代码中我们创建了两个goroutine,但是只有一个核心在执行,因此这两个goroutine会被分时调度,最终输出结果为交替的"A0 B0 A1 B1 A2 B2 A3 B3 A4 B4 A5 B5 A6 B6 A7 B7 A8 B8 A9 B9 ",而在执行后,我们可以通过runtime.NumGoroutine()函数获取当前执行的goroutine数,根据输出可以看到我们的程序只使用了一个核心。
总结
通过以上说明,我们可以得出如下几点结论:
- Golang需要设置GOMAXPROCS才能充分利用多核处理器。
- Golang使用goroutine来实现并发操作,goroutine会被映射到操作系统线程上进行执行。
- Golang的并发模型是基于协程的,而不是进程。