Go 中的 Goroutine 无限循环阻塞 HTTP 服务器
Go 编程语言允许创建并行运行的并发 goroutine。然而,最近的一项观察引起了人们对 HTTP 服务器中无限循环 goroutine 行为的担忧。
根据 Go 文档,使用 8 个 CPU 核心设置 runtime.GOMAXPROCS(8) 应该允许 goroutine 并行运行而不互相阻挡。但是,使用 net/http 包时情况并非如此。无限循环 goroutine 似乎会在几次请求后阻塞服务器。
问题不仅限于代码,因为即使将 runtime.LockOSThread() 添加到无限循环 goroutine 中,它仍然存在。这是意想不到的,因为runtime.LockOSThread()应该确保循环在单独的线程中运行,从而释放其他goroutine以继续执行。
解释
Go运行时的调度程序并不完全是抢占式的。在没有函数调用的情况下,如无限循环代码的情况,不会触发调度程序。这使得无限循环 goroutine 独占 CPU 并阻止其他 goroutine 执行。
解决方案
此问题有几种可能的解决方案:
需要注意的是,runtime.LockOSThread() 并没有完全隔离单独线程中的循环。它允许循环在任何线程上运行,但如果其他 goroutine 需要执行,调度程序仍然可能会中断它。
以上是为什么无限循环 Goroutines 会阻塞 Go 的 HTTP 服务器,尽管有 `runtime.GOMAXPROCS` 和 `runtime.LockOSThread()`?的详细内容。更多信息请关注PHP中文网其他相关文章!