首页 > 后端开发 > Golang > 为什么无限循环 Goroutines 会阻塞 Go 的 HTTP 服务器,尽管有 `runtime.GOMAXPROCS` 和 `runtime.LockOSThread()`?

为什么无限循环 Goroutines 会阻塞 Go 的 HTTP 服务器,尽管有 `runtime.GOMAXPROCS` 和 `runtime.LockOSThread()`?

Linda Hamilton
发布: 2024-12-07 00:15:16
原创
703 人浏览过

Why Do Infinite-Loop Goroutines Block Go's HTTP Server Despite `runtime.GOMAXPROCS` and `runtime.LockOSThread()`?

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 执行。

解决方案

此问题有几种可能的解决方案:

  • 向无限循环添加内容:通过添加主体或函数调用无限循环,调度器会被更频繁地触发,其他goroutines就有机会运行。
  • 定期调用runtime.Gosched:runtime.Gosched()函数可以是用于手动让出调度程序,允许其他 goroutine 执行。这种方法对于性能敏感的应用程序可能并不理想。

需要注意的是,runtime.LockOSThread() 并没有完全隔离单独线程中的循环。它允许循环在任何线程上运行,但如果其他 goroutine 需要执行,调度程序仍然可能会中断它。

以上是为什么无限循环 Goroutines 会阻塞 Go 的 HTTP 服务器,尽管有 `runtime.GOMAXPROCS` 和 `runtime.LockOSThread()`?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板