Golang HTTP Server 在启动无限循环 Goroutine 时阻塞
问题:
为什么当无限循环的 goroutine 启动时,Golang HTTP 服务器会阻塞,尽管有多个由于设置了runtime.GOMAXPROCS(8),线程和goroutines可用?
解释:
出现此问题是因为Go运行时的调度程序不是完全抢占式的。目前,调度程序仅在函数调用期间偶尔调用调度程序。然而,所讨论的无限循环没有任何函数调用,因此不会调用调度程序。
Runtime.LockOSThread() 和缺乏先发制人:
runtime.LockOSThread() 函数被设计为在一个单独的线程上执行它被调用的 goroutine,将其与其他 goroutine 隔离,并且防止它阻塞主线程。然而,在这种情况下,即使runtime.LockOSThread()也没有帮助,因为调度程序的抢占性不够。无限循环继续阻塞其他 goroutine,因为调度程序不会主动切换线程。
解决方案:
要解决此问题,请结合一些实际的逻辑或函数调用进入无限循环可以帮助更频繁地触发调度程序。或者,在无限循环中显式调用runtime.Gosched()可以强制调度程序切换线程,从而允许其他goroutine恢复执行。
以上是为什么当 Goroutine 运行无限循环时,我的 Go HTTP Server 会阻塞?的详细内容。更多信息请关注PHP中文网其他相关文章!