首页 > 后端开发 > Golang > Go 中连续运行的 Goroutine 会导致其他 Goroutine 挨饿吗?

Go 中连续运行的 Goroutine 会导致其他 Goroutine 挨饿吗?

Susan Sarandon
发布: 2024-12-09 06:52:06
原创
255 人浏览过

Can Continuously Running Goroutines Starve Other Goroutines in Go?

Goroutine 协作调度和潜在的执行饥饿

Goroutine 是协作调度的,这意味着它们自愿将执行让给其他 goroutine。虽然这种方法通常可以确保公平性,但它提出了一个问题:避免让步的 goroutines 是否可能会导致其他 goroutine 挨饿。

根据引用的博客文章 (http://blog.nindalf.com/how-goroutines) -work/),连续循环而不产生屈服的 goroutine 确实会使同一线程上的其他 goroutine 挨饿。特定线程上的 Goroutines 是多路复用的,这意味着即使遇到网络输入、休眠或通道操作等阻塞操作,它们也不会阻塞线程。

例如,给定代码中重复使用“sum”函数循环随机次数,将数字相加并打印最终结果。如果使用“go”关键字生成多个这样的 goroutine(如示例所示),它们是否一一执行取决于以下因素:

  • 可用线程数 (GOMAXPROCS ): 如果 GOMAXPROCS 设置为 1,所有 goroutine 将在单个线程上顺序执行,从而导致饥饿。
  • 屈服点: 在 sum 函数中,没有允许 goroutine 屈服的函数调用或同步原语。因此,goroutine 将保持线程直到完成。
  • 最近运行时更改: 引用的博客文章稍微过时了。较新版本的 Go 运行时甚至可以为没有明确让出点的函数(例如“fmt.Println”)安排 goroutine 切换。这样做是为了防止潜在的饥饿。

因此,在没有显式的让出或触发调度的函数调用的情况下,执行无限循环的 goroutine 可能会导致同一线程上的其他 goroutine 饥饿。然而,值得注意的是,Go 运行时会主动尝试平衡 goroutine 执行并防止饥饿。

以上是Go 中连续运行的 Goroutine 会导致其他 Goroutine 挨饿吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

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