【问题标题】:What exactly are goroutines?goroutine 到底是什么?
【发布时间】:2015-01-05 22:47:34
【问题描述】:

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

那么...它们到底是什么?

【问题讨论】:

  • 阅读实现?
  • 在哪里可以找到内置关键字的实现?
  • 我没有看过,但当然是在 Go 的源代码中 - 我主要是说要明确回答这个问题的唯一方法是查看源代码并进行研究。
  • 您可以将它们称为“用户模式线程”,由用户模式调度程序多路复用到操作系统线程。也就是说:当一个 goroutine 开始等待阻塞操作(例如,对远程服务器的 HTTP 调用)时,Go 运行时会寻找其他可以运行的东西,并切换到它(即使它最后一次运行,它运行在不同的操作系统线程上)。

标签: go goroutine


【解决方案1】:

goroutine 与典型的 OS 线程有一些区别:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      从调度器的角度来看:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-06
        • 2013-05-05
        • 2010-11-19
        • 2012-06-16
        • 2011-04-02
        • 2016-04-13
        • 2012-03-07
        • 2013-08-14
        相关资源
        最近更新 更多