Goroutine 在什么时候可以让出执行?
在 Go 程序中,goroutine,轻量级的执行线程,可以在什么时候让出其他 goroutine不同的点,实现并发和高效的资源利用。然而,并非所有 goroutine 执行都会屈服。
传统上,已知 goroutine 主要在面对阻塞系统调用 (syscals) 时屈服。然而,正如之前的讨论中所指出的,函数调用也可以在堆栈增长检查期间触发 goroutine 切换。
问题中描述的行为,即即使没有函数调用或系统调用,goroutine 也会产生结果,已通过Go 1.14 版本中引入了异步抢占。此增强功能使 goroutine 能够在执行过程中的几乎所有点被抢占,即使是在没有函数调用的无限循环中也是如此。
虽然异步抢占显着提高了调度程序的响应能力,但需要注意的是,抢占点可能会被抢占。不同的 Go 版本有所不同。因此,通常不建议依赖特定的抢占点来实现同步。
在问题中提供的示例代码中,输出数组和 oi 索引缺乏同步,使得屈服行为的分析变得复杂。在输出数组中使用字符串可能会涉及垃圾回收,从而引入调度点。
本质上,Go 中的 goroutine 在各个点上产生执行,包括系统调用、函数调用和可能发生的异步抢占点几乎任何地方。异步抢占显着改善了 goroutine 调度行为,但必须避免依赖特定抢占点进行同步。
以上是Go 中的 Goroutines 何时屈服?的详细内容。更多信息请关注PHP中文网其他相关文章!