2 回答

TA贡献1853条经验 获得超18个赞
通道是 Goroutine 相互同步的主要方式之一。因此,它们包含一种机制,可确保一次只有一个 goroutine 能够从通道中提取数据项,并且检索到的数据项不会重复。
您不能指望从同一通道成功读取多个goroutine的任何特定序列,因为哪个特定的goroutine的读取将完成取决于所使用的多线程算法。
看到这个讨论,Goroutines是合作安排的。这是否意味着不产生执行力的 goroutines 将导致 goroutines 逐个运行?
您可以根据多个 goroutine 是否从同一通道读取数据。然后,当通道中有要读取的数据时,其中一个 goroutine 将成功读取,并且等待从通道读取成功的任何其他 goroutine 都不会读取数据。
请参阅来自 golang-book.com 的并发性,其中解释了并发性以及通道和通道。
另请参阅如何使用通道在 Go 中安全地同步数据。
另请参阅此答案,其中描述了使用通道而不是同步原语(如互斥锁)来维护侦听器的动态列表:https://stackoverflow.com/a/18897083/1466970
另请参阅这篇冗长且有些令人筋疲力尽的描述 Go 中的通道剖析 - Go 中的并发性。

TA贡献1868条经验 获得超4个赞
这里对Go通道内部的分析相当不错 https://codeburst.io/diving-deep-into-the-golang-channels-549fd4ed21a8
基本上,通道维护一个等待读取操作的内部goroutine队列。当发送某些内容时,它只会从该队列中选择一个goroutine,并为其提供数据。如果没有人在等待 - 数据进入缓冲区或阻止写入器。
- 2 回答
- 0 关注
- 135 浏览
添加回答
举报