什么是goroutines?

时间:2015-01-05 22:47:34

标签: go goroutine

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

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

3 个答案:

答案 0 :(得分:8)

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

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

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

  • fibers,与用户模式预定线程相关的术语
  • green threads,另一个用于指代用户模式调度线程的术语
  • coroutines,指的是可以在代码中的任意点处相互控制的例程
  • event-driven architectures,可能会在等待网络I / O等异步事件时切换到其他任务,但可能无法呈现类似线程的接口(例如,他们可能会使用回调函数)
  • M:N hybrid threading,涉及内核和用户模式线程,可能涉及跨OS线程迁移用户模式线程。

答案 1 :(得分:1)

当有两个CPU时,goroutine(s)作为真实线程运行。当具有单个CPU时,goroutine将作为单个线程的协同例程运行,并在切换其上下文的情况下运行。 goroutine并没有坚持固定的线程。所以它没有像thread-id这样的标识符。如果你想将goroutine作为OS线程,你需要使用runtime.LockOSThread()

答案 2 :(得分:0)

This Morsing's blog post about the Go scheduler很不错,因为它有三角形,正方形和圆形的图片。

从调度程序的角度来看:

  

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