Google I/O 2012 演讲“Go Concurrency Patterns”提出了 Go 语言中的 Goroutine 是否是轻量级线程的问题,作为协程实现。
协程定义和比较
协程通常意味着不同协程之间的显式控制传输机制。程序员可以通过编程方式确定协程何时应暂停执行并将控制权传递给另一个协程。
Goroutine 实现
相比之下,Go goroutine 会在特定但最终不确定的情况下隐式放弃控制权点。例如,goroutines 在执行 I/O 操作或通过通道发送数据之前被挂起。这种方法允许程序员编写有效共享状态的顺序、轻量级进程。
实现细节
goroutine 的实现类似于“状态线程”库,操作处于较低水平。 Go 直接与操作系统内核交互,无需依赖外部库。
更新:提议的协程包
2023 年,Russ Cox 为 Go 提出了一个标准协程包,提供了显式控制转移和协作调度的框架。
其他注意
在 Go 1.14 之前,goroutine 是非抢占式调度的,内核可以随时挂起线程。从 Go 1.14 开始,goroutines 已经被(几乎)抢占式调度,允许对其执行进行更精细的控制。
以上是Go Goroutines 是真正的协程吗?的详细内容。更多信息请关注PHP中文网其他相关文章!