Goroutine 协作调度和潜在的执行饥饿
Goroutine 是协作调度的,这意味着它们自愿将执行让给其他 goroutine。虽然这种方法通常可以确保公平性,但它提出了一个问题:避免让步的 goroutines 是否可能会导致其他 goroutine 挨饿。
根据引用的博客文章 (http://blog.nindalf.com/how-goroutines) -work/),连续循环而不产生屈服的 goroutine 确实会使同一线程上的其他 goroutine 挨饿。特定线程上的 Goroutines 是多路复用的,这意味着即使遇到网络输入、休眠或通道操作等阻塞操作,它们也不会阻塞线程。
例如,给定代码中重复使用“sum”函数循环随机次数,将数字相加并打印最终结果。如果使用“go”关键字生成多个这样的 goroutine(如示例所示),它们是否一一执行取决于以下因素:
因此,在没有显式的让出或触发调度的函数调用的情况下,执行无限循环的 goroutine 可能会导致同一线程上的其他 goroutine 饥饿。然而,值得注意的是,Go 运行时会主动尝试平衡 goroutine 执行并防止饥饿。
以上是Go 中连续运行的 Goroutine 会导致其他 Goroutine 挨饿吗?的详细内容。更多信息请关注PHP中文网其他相关文章!