通过通道在 Go 中进行通信

Communication in Go via channels

考虑这样的情况。有1家主goroutine 10家子公司 协程。他们都可以访问 channel。主发送 1000 个数字到这个频道,辅助的将从它读取。 是否可以保证每个子 goroutine 将恰好读取 100 个数字,或者这个数量可能会有所不同,例如某些 goroutine 将读取 99 个数字而另一个 goroutine 将读取 101 个?

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

通过无缓冲通道进行 goroutine 调度,然后有趣的是通道纯粹用作阻塞机制 - 因为值永远不会 "sent into the channel" 而实际上什么都没有 "reads from" 它。

无缓冲通道纯粹作为一种同步机制工作:对于在通道上发送的 goroutine,它的工作方式更多地遵循 "sleep until some goroutine is ready to receive",对于接收 goroutine,它是 "sleep until some goroutine is ready to send"。

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