为什么 goroutine 上没有 .join 操作?

6 go goroutine

为什么goroutine上没有.join操作(即阻塞直到完成)操作?而不必使用通道来沟通何时在主 goroutine 中继续进行?

感觉我错过了有关 CSP 理论的一些基本知识。

编辑: 我问“为什么会这样”,而不是“我如何实现这一点”。

Sir*_*ius 4

这只是因为goroutine 不是线程。给定的 goroutine 可以由 Go 运行时调度为与操作系统线程关联,但例如在阻塞 I/O 操作的情况下,所述线程可以在另一个 goroutine 等待时与其他 goroutine 关联。

这是什么意思?

加入需要一个同步对象才能知道线程何时完成。由于 Go 的 goroutine 实际上只是非常轻量级的对象,仅拥有一个堆栈,因此它们不直接提供此类同步对象。

Go 的 CSP 前提是您可以非常便宜地实例化数千个 goroutine,并且仅使用与物理 CPU 核心相同数量的线程。从操作系统的角度来看,同步对象是昂贵的,因此为每个 goroutine 拥有这样的对象将是非常低效的。

相反,同步是通过使用同步包中的通道或 WaitGroup 来实现的。

  • 我想说,这与 goroutine 不是线程没有任何关系,它根源于这样一个事实:它是一种设计选择,使 goroutine 不可识别或不可寻址。理论上,运行时可以提供连接,因为它可以确定 goroutine 何时返回,但您无法“连接”无法获得引用的内容。 (4认同)
  • 这次真是万分感谢。我会接受这个作为答案。(不敢相信我被那些可能甚至不知道这一点的人否决了 6 次。) (2认同)