为什么goroutine上没有.join操作(即阻塞直到完成)操作?而不必使用通道来沟通何时在主 goroutine 中继续进行?
感觉我错过了有关 CSP 理论的一些基本知识。
编辑: 我问“为什么会这样”,而不是“我如何实现这一点”。
这只是因为goroutine 不是线程。给定的 goroutine 可以由 Go 运行时调度为与操作系统线程关联,但例如在阻塞 I/O 操作的情况下,所述线程可以在另一个 goroutine 等待时与其他 goroutine 关联。
这是什么意思?
加入需要一个同步对象才能知道线程何时完成。由于 Go 的 goroutine 实际上只是非常轻量级的对象,仅拥有一个堆栈,因此它们不直接提供此类同步对象。
Go 的 CSP 前提是您可以非常便宜地实例化数千个 goroutine,并且仅使用与物理 CPU 核心相同数量的线程。从操作系统的角度来看,同步对象是昂贵的,因此为每个 goroutine 拥有这样的对象将是非常低效的。
相反,同步是通过使用同步包中的通道或 WaitGroup 来实现的。
| 归档时间: |
|
| 查看次数: |
2746 次 |
| 最近记录: |