GOMAXPROCS 设置为 2,但程序仍然受到影响
尽管设置了 runtime.GOMAXPROCS(2),但程序在输出数字时遇到挂起问题。虽然观察到 CPU 使用率很高,但故障原因仍然难以捉摸。
提供的代码具有两个 goroutine:forever()(繁忙循环)和 show()(以无限循环打印数字)。主函数设置 GOMAXPROCS 使用两个 CPU 内核。然而,程序变得无响应。
问题在于forever()的持续运行。通过不断运行,它会消耗整个操作系统线程并扰乱运行时的 goroutine 调度。具体来说,在 Go 1.5 中,它会阻碍垃圾收集的 stop-the-world 阶段。
为了解决这个问题,可以用定期释放 CPU 的函数来替换 forever() 中的繁忙循环。或者,也可以将其完全删除,因为不需要无限循环。
例如,按如下方式修改forever() 可以解决问题:
func forever() { for { runtime.Gosched() } }
通过在循环中,goroutine 可以放弃控制并允许其他 goroutine 执行。这确保了所有 goroutine,包括那些负责核心功能的 goroutine,都可以高效运行。
以上是为什么我的 Go 程序尽管设置了 `runtime.GOMAXPROCS(2)` 还是会冻结?的详细内容。更多信息请关注PHP中文网其他相关文章!