我读过的教程和文档都说 goroutine 是“不完全是线程”或“轻量级线程”,但通常可以将它们视为它们自己的单独线程。
那么...它们到底是什么?
Goroutine 与典型操作系统线程有一些区别:
- There's 用户态调度。当一个 goroutine 被阻塞时(比如在网络上等待),Go 运行时会寻找另一个可以运行的 goroutine。这种情况的发生无需进入和退出内核模式,也无需运行操作系统内核的调度程序。
- 没有only用户模式调度:为了使用多个核心,Go 将启动多个操作系统线程并在所有线程上运行 goroutine,可能会在操作系统线程之间移动 goroutine 以保持所有事务繁忙。如果您听说 goroutine 被“多路复用”到操作系统线程上,那就是这个意思。
- 它们的启动成本应该很低。堆栈一开始很小,只有几千字节,然后根据需要不断增长,无论操作系统是否使用虚拟内存过量使用。
- 它们与语言紧密相连;除了
go
声明本身有渠道类型 http://golang.org/ref/spec#Channel_types和运营和select声明 http://golang.org/ref/spec#Select_statements用于协调 goroutine。
- They lack一些操作系统线程功能:目前,Go 的调度程序不能保证公平性,并且只有非常有限的抢占(一个空的)
for{}
循环永远不会被切换离开)。
它们与许多其他术语密切相关:
-
fibers https://en.wikipedia.org/wiki/Fiber_%28computer_science%29,与用户模式调度线程相关的术语
-
绿线 https://en.wikipedia.org/wiki/Green_threads,用于指代用户模式调度线程的另一个术语
-
协程 https://en.wikipedia.org/wiki/Coroutine,指的是可以在代码中任意点相互控制的例程
-
事件驱动架构 https://en.wikipedia.org/wiki/Event-driven_architecture,它可能会在等待网络 I/O 等异步事件时切换到其他任务,但可能不会提供类似线程的接口(例如,它们可能会使用回调函数)
-
M:N 混合螺纹 https://en.wikipedia.org/wiki/Thread_(computing)#Models,它涉及内核模式线程和用户模式线程,并且可能涉及跨操作系统线程的用户模式线程迁移。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)