
本文旨在帮助 Golang 开发者了解如何确定 Go 程序实际运行的处理器数量。我们将介绍 runtime.GOMAXPROCS 和 runtime.NumCPU 的作用,并提供一个实用函数来计算程序可以使用的最大并行度。通过本文,您将能够更好地控制和优化 Go 程序的并发性能。
理解 GOMAXPROCS 和 NumCPU
在 Golang 中,并发执行的 goroutine 数量受到两个关键因素的限制:runtime.GOMAXPROCS 和 runtime.NumCPU。
runtime.GOMAXPROCS(n int) int: 此函数用于设置可同时执行的最大 CPU 数量。如果 n 小于 1,则该函数仅返回当前设置的值,而不进行修改。 GOMAXPROCS 限制了可以并行执行的 goroutine 数量。
-
runtime.NumCPU() int: 此函数返回当前机器上的逻辑 CPU 数量。
立即学习“go语言免费学习笔记(深入)”;
程序实际运行的处理器数量,受限于 GOMAXPROCS 和 NumCPU 两者中的较小值。 这意味着即使机器拥有多个 CPU 核心,如果 GOMAXPROCS 设置为 1,程序也只会使用一个核心。
如何确定最大并行度
为了方便确定程序可以使用的最大并行度,可以编写一个辅助函数,该函数返回 GOMAXPROCS 和 NumCPU 中的最小值。
动态WEB网站中的PHP和MySQL详细反映实际程序的需求,仔细地探讨外部数据的验证(例如信用卡卡号的格式)、用户登录以及如何使用模板建立网页的标准外观。动态WEB网站中的PHP和MySQL的内容不仅仅是这些。书中还提到如何串联JavaScript与PHP让用户操作时更快、更方便。还有正确处理用户输入错误的方法,让网站看起来更专业。另外还引入大量来自PEAR外挂函数库的强大功能,对常用的、强大的包
package main
import (
"fmt"
"runtime"
)
func MaxParallelism() int {
maxProcs := runtime.GOMAXPROCS(0)
numCPU := runtime.NumCPU()
if maxProcs < numCPU {
return maxProcs
}
return numCPU
}
func main() {
max := MaxParallelism()
fmt.Printf("Maximum parallelism: %d\n", max)
}代码解释:
- MaxParallelism() 函数首先使用 runtime.GOMAXPROCS(0) 获取当前 GOMAXPROCS 的值,而不进行修改。
- 然后,使用 runtime.NumCPU() 获取机器上的逻辑 CPU 数量。
- 比较这两个值,并返回较小的一个。
运行示例:
如果机器有 8 个逻辑 CPU 核心,并且 GOMAXPROCS 设置为 4,则 MaxParallelism() 将返回 4。如果 GOMAXPROCS 没有设置,默认为机器的CPU核心数,MaxParallelism()将返回8。
示例代码:验证处理器数量
下面的示例代码演示了如何使用 MaxParallelism() 函数来验证程序实际使用的处理器数量。
package main
import (
"fmt"
"runtime"
"sync"
)
var wg sync.WaitGroup
func doTasks() {
fmt.Println(" Doing task ")
for ji := 1; ji < 100000000; ji++ {
for io := 1; io < 10; io++ {
//Some computations
}
}
runtime.Gosched()
wg.Done()
}
func MaxParallelism() int {
maxProcs := runtime.GOMAXPROCS(0)
numCPU := runtime.NumCPU()
if maxProcs < numCPU {
return maxProcs
}
return numCPU
}
func main() {
max := MaxParallelism()
fmt.Printf("Maximum parallelism: %d\n", max)
wg.Add(1)
runtime.GOMAXPROCS(max) // Set GOMAXPROCS to the maximum parallelism
go doTasks()
doTasks()
wg.Wait()
}代码解释:
- 在 main() 函数中,首先调用 MaxParallelism() 获取最大并行度。
- 然后,使用 runtime.GOMAXPROCS(max) 将 GOMAXPROCS 设置为计算出的最大值。 这确保程序可以充分利用所有可用的 CPU 核心。
- 启动两个 goroutine 执行 doTasks() 函数。
- doTasks() 函数模拟一些计算密集型任务。
- runtime.Gosched() 会使当前 goroutine 放弃处理器,允许其他 goroutine 运行。
注意事项
- 设置 GOMAXPROCS 应该在程序启动时进行,并且通常只需要设置一次。
- 过度增加 GOMAXPROCS 的值,超过实际 CPU 核心数量,可能导致上下文切换开销增加,反而降低性能。 因此,最好将其设置为机器的逻辑 CPU 数量。
- GOMAXPROCS 影响的是 Go 调度器可以使用的操作系统线程数量,而不是 goroutine 的数量。 可以创建成千上万的 goroutine,但只有 GOMAXPROCS 个 goroutine 能够真正并行执行。
总结
通过理解 runtime.GOMAXPROCS 和 runtime.NumCPU 的作用,以及使用 MaxParallelism() 函数,可以有效地控制和优化 Go 程序的并发性能。 正确设置 GOMAXPROCS 可以确保程序充分利用可用的 CPU 资源,从而提高程序的执行效率。 在编写并发程序时,始终考虑这些因素,以便获得最佳性能。









