猿问

多个戈鲁丁的数据重复

我正在学习 goroutines 和通道,并且有一个问题,即如果多个 goroutine 尝试从同一通道获取数据会发生什么。

Go 运行时如何确保由多个 goroutine 读取的通道中的数据仅提供给在通道上等待的一个 goroutine,而不会复制或发送到多个 goroutine。

当有多个 goroutine 尝试从完全相同的通道获取数据时,go 运行时是否会阻止争用条件?是否有某种排序,例如先到先得的数据是哪个等待的goroutines?


隔江千里
浏览 136回答 2
2回答

慕容森

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

MYYA

这里对Go通道内部的分析相当不错 https://codeburst.io/diving-deep-into-the-golang-channels-549fd4ed21a8基本上,通道维护一个等待读取操作的内部goroutine队列。当发送某些内容时,它只会从该队列中选择一个goroutine,并为其提供数据。如果没有人在等待 - 数据进入缓冲区或阻止写入器。
随时随地看视频慕课网APP

相关分类

Go
我要回答