Goroutine 阻塞其他 Goroutine
在给定的代码片段中,第一个 Goroutine 进入无限循环,阻止剩余的 Goroutine 发送到超时通道。这种行为是 Goroutines 中协作调度的一个特征。
Goroutines 在以下场景中屈服于调度程序:
在这种情况下,第一个goroutine中的无限循环阻止它屈服于调度程序。因此,另一个 goroutine 无法发送到超时通道,程序会继续无限期地运行,而不是在一秒后终止。
此问题的一个潜在解决方案是使用抢占式调度程序而不是协作调度程序。在抢占式调度器中,系统根据 Goroutine 的优先级强制在 Goroutine 之间切换。然而,Go 目前使用的是协作调度程序。
另一种策略是使用 runtime.Gosched() 手动屈服于调度程序。但是,由于通过通道或系统 I/O 进行了充分的通信,因此在大多数程序中通常不需要此技术。
需要注意的是,将 GOMAXPROCS 设置为更高的值可能无法完全解决问题。虽然它允许多个 goroutine 并行运行,但垃圾收集器仍然以同步方式运行。如果高 CPU 协程永远不会让步,GC 可以在运行时无限期地阻塞其他协程。
以上是为什么 Goroutine 会互相阻塞,如何解决这个问题?的详细内容。更多信息请关注PHP中文网其他相关文章!