为了账号安全,请及时绑定邮箱和手机立即绑定

goroutine 到底是什么?

goroutine 到底是什么?

Go
红糖糍粑 2021-09-10 17:10:39
我读过的教程和文档都说 goroutines 是“不完全是线程”或“轻量级线程”,但通常可以将它们视为它们自己的单独线程。那么……它们到底是什么?
查看完整描述

3 回答

?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

goroutine 与典型的 OS 线程的区别有以下几点:

  • 用户模式调度。当一个 goroutine 被阻塞(比如在网络上等待)时,Go 运行时会寻找另一个可以运行的 goroutine。这不需要进入和退出内核模式,也不需要操作系统内核的调度程序运行。

  • 没有唯一的用户模式调度:使用多个内核,Go会启动多个操作系统线程和运行够程上所有的人,潜在的移动操作系统线程之间的goroutine把一切都很忙。如果你听说 goroutines 被“多路复用”到操作系统线程上,那就是它的意思。

  • 它们的开始成本很低。堆栈开始很小,只有几千字节,并根据需要增长,无论操作系统是否使用虚拟内存过量使用。

  • 它们与语言紧密相连;除了go语句本身,还有用于协调 goroutine 的通道类型和操作和select语句

  • 它们缺乏一些操作系统线程功能:目前,Go 的调度程序不能保证公平性,并且只有非常有限的抢占(for{}永远不会切换空循环)。

它们与许多其他术语密切相关:

  • 纤维,一个与用户模式调度线程相关的术语

  • 绿色线程,另一个用于指代用户模式调度线程的术语

  • 协程,指的是可以在其代码中的任意点相互让出控制权的例程

  • 事件驱动架构,它可能会在等待网络 I/O 等异步事件时切换到其他任务,但可能不会呈现类似线程的接口(例如,它们可能会使用回调函数)

  • M:N 混合线程,涉及内核和用户模式线程,并且可能涉及跨操作系统线程的用户模式线程迁移。


查看完整回答
反对 回复 2021-09-10
?
桃花长相依

TA贡献1860条经验 获得超8个赞

当有两个 CPU 时,goroutine(s) 作为真正的线程运行。当具有单个 CPU 时,goroutine 作为单线程的协程运行,这些线程在切换上下文时运行。goroutine 不会粘住固定线程。所以它不像线程ID那样标识符。如果你想把 goroutine 作为 OS 线程,你需要使用runtime.LockOSThread().


查看完整回答
反对 回复 2021-09-10
?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

Morsing 的这篇关于 Go 调度器的博客文章很好,因为它有三角形、正方形和圆形的图片。

从调度程序的角度来看:

goroutine 包括堆栈、指令指针和其他对调度很重要的信息。


查看完整回答
反对 回复 2021-09-10
  • 3 回答
  • 0 关注
  • 206 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信