go - 多个 goroutine 的数据重复
问题描述
我正在学习 goroutine 和通道,并且有一个问题,如果多个 goroutine 尝试从同一个通道获取数据会发生什么。
Go 运行时如何确保多个 goroutine 正在读取的通道中的数据仅提供给在通道上等待的一个 goroutine,而不是复制或发送到多个 goroutine。
当有多个 goroutine 试图从完全相同的通道获取数据时,go 运行时是否会阻止竞争条件?对于哪些等待的 goroutine 被赋予数据,例如先来先服务,是否有某种排序?
解决方案
通道是 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 的这篇冗长且有些令人筋疲力尽的描述。
推荐阅读
- c# - 控制器的正确网址
- sql-server - 当针对日期时间列查询少于 90 天时,如何“忽略”1/1/1753?
- angular - 视图完全加载后如何从另一个组件调用方法(AppComponent)?
- batch-file - 我正在尝试使用第二个变量将数组中的信息设置到变量中以检索信息
- tfs - TFS 到 VSTS 同步
- laravel - Laravel 与自定义数据透视表的多态关系
- amazon-web-services - AWS - Elastic Beanstalk:无法删除环境变量 - 恢复到以前的值
- r - 在 R 中使用“mtcars”数据集绘制 LASSO 模型
- javascript - 如何使用关闭按钮创建这个多动态 id 特定的手风琴?
- java - 如何拦截 HttpResponse 发送的默认 200 响应?