`runtime.GOMAXPROCS` 是 Go 语言标准库中的一个函数,用于设置和获取可以同时执行的最大 CPU 数量。它是 Go 运行时调度器的重要部分,影响 Go 程序的并发性能。 ### 用法 `runtime.GOMAXPROCS` 的签名如下: ``` func GOMAXPROCS(n int) int ``` - `n`:要设置的最大 CPU 核数。如果 `n` 为 0 或负数,`GOMAXPROCS` 不会改变当前的设置,只返回当前的值。 - 返回值:函数会返回之前的 `GOMAXPROCS` 设置值。 ### 示例代码 以下是一个简单的示例展示如何使用 `runtime.GOMAXPROCS`: ``` package main import ( "fmt" "runtime" ) func main() { // 获取当前的 GOMAXPROCS 设置 currentProcs := runtime.GOMAXPROCS(0) fmt.Printf("Current GOMAXPROCS: %d\n", currentProcs) // 设置 GOMAXPROCS 为 4 previousProcs := runtime.GOMAXPROCS(4) fmt.Printf("Previous GOMAXPROCS: %d\n", previousProcs) // 再次获取当前的 GOMAXPROCS 设置 currentProcs = runtime.GOMAXPROCS(0) fmt.Printf("New GOMAXPROCS: %d\n", currentProcs) } ``` ### 解释 1. **获取当前 `GOMAXPROCS` 设置**: ``` currentProcs := runtime.GOMAXPROCS(0) ``` 调用 `runtime.GOMAXPROCS(0)`,传入 0 表示不改变当前设置,只返回当前的 `GOMAXPROCS` 值。 2. **设置 `GOMAXPROCS`**: ``` previousProcs := runtime.GOMAXPROCS(4) ``` 调用 `runtime.GOMAXPROCS(4)`,将最大并发执行的 CPU 数量设置为 4。函数返回之前的 `GOMAXPROCS` 值。 3. **再次获取当前的 `GOMAXPROCS` 设置**: ``` currentProcs = runtime.GOMAXPROCS(0) ``` 再次获取当前的 `GOMAXPROCS` 值,验证新的设置是否生效。 ### 注意事项 - **默认值**:在 Go 1.5 之前,`GOMAXPROCS` 的默认值是 1,这意味着默认情况下 Go 程序只能使用一个 CPU 核。在 Go 1.5 及以后,默认值是运行时机器上的 CPU 核数。 - **性能影响**:设置过高的 `GOMAXPROCS` 值可能导致过多的上下文切换和资源争用,反而会降低程序性能。一般来说,`GOMAXPROCS` 的值设置为物理 CPU 核数是一个合理的选择。 - **并发模型**:Go 的调度器使用的是 M:N 模型,其中 M 个 goroutine 映射到 N 个 OS 线程上。`GOMAXPROCS` 控制的是可以同时运行的 OS 线程数。 ### 总结 `runtime.GOMAXPROCS` 是 Go 语言中的一个重要函数,用于设置和获取可以同时执行的最大 CPU 数量。合理设置 `GOMAXPROCS` 可以显著影响 Go 程序的并发性能。通过理解和使用 `GOMAXPROCS`,开发者可以更好地控制 Go 程序的调度行为,优化程序性能。