为什么无限循环 Goroutine 会阻塞 Go HTTP Server
尽管将最大可用线程数设置为 8,但还是启动了一个无限-循环 goroutine 会导致 HTTP 服务器在几次调用后阻塞。这种行为与独立线程会防止阻塞的假设相矛盾。
解释:
Go 运行时的调度程序以非完全抢占式方式运行。虽然它在函数调用期间定期调用调度程序,但没有这些调用的无限循环会阻止调度程序被触发。这种非抢占式行为会导致无限循环 goroutine 消耗所有可用线程,不为 HTTP 服务器留下任何线程。
runtime.LockOSThread()
添加运行时。 LockOSThread() 到无限循环应该强制其在单个线程上执行,从而将其与 HTTP 服务器隔离。但是,它无法解决问题。
根据 Go 文档中的 runtime.LockOSThread(),目标空循环应该在单独的线程中运行,允许其他 goroutine 并发执行。但是,示例中的空循环似乎不足以触发线程分离。
解决方案:
要解决此问题,您可以使用具有一些实际执行逻辑的循环或在循环内手动调用runtime.Gosched()。这将触发调度程序并允许其他 goroutine(包括 HTTP 服务器)恢复执行。
以上是为什么无限循环 Goroutine 即使有线程限制也会阻塞 Go HTTP 服务器?的详细内容。更多信息请关注PHP中文网其他相关文章!