什么是goroutines?

Cor*_*urn 2 go goroutine

我读过的教程和文档都说goroutine是"不完全线程"或"轻量级线程",但通常可以将它们视为它们自己的独立线程.

那么......他们真的是什么?

two*_*two 9

将goroutine与典型的OS线程区分开来:

  • 用户模式调度.当goroutine被阻塞(比如在网络上等待)时,Go运行时会查找另一个可以运行的运行时.这种情况发生在不必进入和退出内核模式且没有运行OS内核的调度程序的情况下.
  • 没有唯一的用户模式调度:使用多个内核,Go会启动多个操作系统线程和运行够程上所有的人,潜在的移动操作系统线程之间的goroutine把一切都很忙.如果您听说goroutine被"多路复用"到OS线程上,那就意味着它.
  • 它们的开始意味着低成本.无论操作系统是否使用虚拟内存过量使用,堆栈都会开始很小,只有几千字节并且会根据需要增长.
  • 他们与语言联系在一起; 除了go语句本身,还有用于协调goroutines的通道类型和操作以及select语句.
  • 它们缺少一些操作系统线程功能:目前,Go的调度程序并不能保证公平性,并且只有非常有限的抢占(空for{}循环永远不会被切换掉).

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

  • fiber,与用户模式调度线程结合使用的术语
  • 绿色线程,另一个用于表示用户模式调度线程的术语
  • 协同程序,指的是可以在代码中的任意点处相互控制的例程
  • 事件驱动的体系结构,可能在等待网络I/O等异步事件时切换到其他任务,但可能不会呈现类似线程的接口(例如,它们可能会使用回调函数)
  • M:N混合线程,涉及内核和用户模式线程,并且可以涉及跨OS线程的用户模式线程的迁移.