【问题标题】:Communication in Go via channelsGo 中通过渠道进行通信
【发布时间】:2017-11-24 13:45:54
【问题描述】:

考虑这种情况。有一个主goroutine和十个子公司 协程。他们都可以访问channel。主要的发送1000 号码到这个频道,附属的将从它读取。 是否可以保证每个附属 goroutine 将准确读取 100 个数字,或者这个数量可能会有所不同,例如某些 goroutine 将读取 99 个数字和另一个 101?

【问题讨论】:

  • 没有保证,为什么需要这样的保证?
  • @tkausl 在 goroutine 之间统一分配任务
  • 不仅没有这样的保证,甚至没有理由假设在正常情况下会发生这种情况。

标签: go channel goroutine


【解决方案1】:

不,不能保证,因为它取决于每个 goroutine 的运行时间,这取决于 goroutine 在 CPU 上的分布情况。

【讨论】:

  • 如果有趣的话,我发现了一篇关于如何安排 GoRoutines 的博文 here
【解决方案2】:

通过无缓冲通道的 goroutine 调度,有趣的事情是通道纯粹用作阻塞机制 - 因为值永远不会“发送到通道”并且实际上没有“读取”它。

无缓冲通道纯粹作为一种同步机制工作:对于在通道上发送的 goroutine,它的工作方式更像是“休眠直到某个 goroutine 准备好接收”,而对于接收 goroutine,它是“休眠直到某个 goroutine准备发送”。

这应该清楚地表明,发送和接收没有内置的公平或分配系统 - 它们纯粹是先到先服务,或者甚至可能更加随意,具体取决于调度程序的当前负载。

【讨论】:

  • 在 CSP 的思维方式中,这种区分是不必要的,您的描述无助于澄清事情。无缓冲通道是数据事件流经的“正常”通道。缓冲通道具有扩展行为。
  • 我确信这是一种在概念上更正确的放置方式,但是“数据事件流”这个词让我想到了一个管道或队列——这意味着无论数据事件都将被接受另一端的状态。不过,这不是无缓冲通道在 Go 中的工作方式。
猜你喜欢
  • 2017-11-09
  • 1970-01-01
  • 2017-09-10
  • 1970-01-01
  • 1970-01-01
  • 2011-12-22
  • 1970-01-01
  • 2022-12-10
  • 1970-01-01
相关资源
最近更新 更多