首页 > 解决方案 > 多个 goroutine 的数据重复

问题描述

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

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

当有多个 goroutine 试图从完全相同的通道获取数据时,go 运行时是否会阻止竞争条件?对于哪些等待的 goroutine 被赋予数据,例如先来先服务,是否有某种排序?

标签: goconcurrency

解决方案


通道是 goroutine 相互同步的主要方式之一。因此,它们包含一种机制,以确保一次只有一个 goroutine 能够从通道中提取数据项,并且检索到的数据项不重复。

您不能真正指望从同一通道成功读取的多个 goroutine 的任何特定序列,因为特定 goroutine 的读取将完成取决于所使用的多线程算法。

看到这个讨论,Goroutines 是协同调度的。这是否意味着不产生执行的 goroutine 会导致 goroutine 一个接一个地运行?

您可以依赖多个 goroutine 是否从同一个通道读取数据。然后,当通道中有数据要读取时,其中一个 goroutine 将成功读取,并且正在等待从通道读取成功的任何其他 goroutine 都不会读取读取的数据。

请参阅golang-book.com 的 Concurrency,其中解释了并发和 goroutines 和通道。

另请参阅如何使用通道在 Go 中安全地同步数据

另请参阅此答案,该答案描述了使用通道而不是诸如互斥锁之类的同步原语来维护侦听器的动态列表:https ://stackoverflow.com/a/18897083/1466970

另请参阅 Go-Concurrency in Go 中的Anatomy of Channels in Go-Concurrency 的这篇冗长且有些令人筋疲力尽的描述。


推荐阅读