问题:无限循环 Goroutine 阻塞 HTTP 服务器
在 Go 中,当使用较少线程时,无限循环 Goroutine 会阻塞其他 Goroutine比可用的核心数,即使相应地设置了runtime.GOMAXPROCS。然而,当使用 net/http 包时,这种行为会有所不同。
问:为什么无限循环 goroutine 在几次调用后会阻塞 HTTP 服务器?
A: Go 运行时的调度程序不是完全抢占式的。在您的示例中,无限循环不包含函数调用,从而防止调度程序进行干预。这会导致一个线程持续处理循环,阻塞其他 goroutine,包括 HTTP 服务器。
问:为什么 runtime.LockOSThread() 无法解决问题?
A:runtime.LockOSThread() 旨在确保空循环在单独的线程中运行。然而,调度程序的非抢占性质使得这种方法在这种情况下无效。
解决方案:
以上是为什么无限循环 Goroutine 会阻塞 Go HTTP Server?的详细内容。更多信息请关注PHP中文网其他相关文章!