尽管使用了 GOMAXPROCS(2),程序仍然停滞
遇到一个令人困惑的场景,其中配置了 runtime.GOMAXPROCS(2) 的程序继续在数字输出期间挂起是一个令人困惑的情况。尽管 CPU 利用率很高,但 for 循环 goroutine 似乎阻碍了程序功能。
深入探究原因
这段代码的罪魁祸首在于存在一个名为forever 连续执行无限 for 循环而不会暂停。此操作会导致整个操作系统线程的完全消耗,从而有效地干扰运行时的 goroutine。
解决问题
要纠正这种情况,至关重要的是消除不必要的永久 goroutine。此外,在 show 函数的 for 循环中插入调度点可以恢复程序功能。
修改代码
func show() { for number := 1; number < 999999; number++ { time.Sleep(1000) fmt.Println(number) runtime.Gosched() // Scheduling point to yield control to the runtime } }
消除繁忙循环
避免缺乏任何生产性工作的繁忙循环至关重要。它们不必要地消耗 CPU 资源,并且不利于 goroutine 的整体性能。相反,请考虑将暂停合并到循环中或完全消除循环以优化程序行为。
以上是为什么我的 Go 程序在 `runtime.GOMAXPROCS(2)` 和高 CPU 使用率的情况下挂起?的详细内容。更多信息请关注PHP中文网其他相关文章!