协作调度的 Goroutines:探索阻塞执行的潜力
goroutine 背后的核心概念是它们的协作调度,如所提供的博客中所强调的那样来自宁道夫的帖子。这种合作性质意味着 goroutine 本质上是自我调节其执行,而不依赖于底层内核的抢占式中断。
考虑到这种调度模型,出现了一个关键问题:无限循环而不产生执行的 goroutine 是否可以有效地饿死其他进程同一线程上的 goroutine?
为了解决这个问题,让我们考虑一下帖子中提供的代码片段。 sum 函数只是计算并打印指定限制内的整数之和。
当使用多个 goroutine 执行此代码时,很明显,如果只有一个线程可用,则 goroutine 将不会同时运行。相反,它们会依次执行。
这种行为的原因在于 goroutine 的协作调度机制。如果没有明确的让步点,当前正在执行的 goroutine 将继续这样做,直到遇到必须放弃控制权的情况。
示例代码中,没有任何阻塞操作,例如通道通信,网络输入或系统调用意味着 goroutine 将无限期地执行循环。结果,它将独占线程,阻止其他 goroutine 运行。
为了缓解这个问题,必须将让步点合并到 goroutine 执行中。这可以通过各种机制来实现,包括:
通过采用这些技术,开发人员可以确保 goroutine 不会无限期阻塞,从而在多线程环境中实现更平衡、更高效的执行。
以上是不屈服的 Goroutine 能否在单线程上让其他 Goroutine 挨饿?的详细内容。更多信息请关注PHP中文网其他相关文章!