すべて同じメッセージを受信するチャネルのスライスがあります。
func broadcast(c <-chan string, chans []chan<- string) {
for msg := range c {
for _, ch := range chans {
ch <- msg
}
}
}
ただし、各チャネルはchans
異なる速度で読み取られる可能性があるため、コンシューマが遅いときに他のチャネルをブロックしたくありません。私はゴルーチンでこれを解決しました:
func broadcast(c <-chan string, chans []chan<- string) {
for msg := range c {
for _, ch := range chans {
go func() { ch <- msg }()
}
}
}
ただし、各チャネルに渡されるメッセージの順序は重要です。仕様を調べて、ブロックされたときにチャネルが順序を保持するかどうかを確認しましたが、見つかったのはこれだけでした:
容量が 0 より大きい場合、チャネルは非同期です。バッファーがいっぱいでない (送信) または空でない (受信) 場合、通信操作はブロックされることなく成功し、要素は送信された順序で受信されます。
私にとって、書き込みがブロックされている場合、それは「送信」されていませんが、送信されるのを待っています。その前提で、上記は、書き込み時に複数のゴルーチンがブロックされている場合の送信順序について何も述べていません。
チャネルのブロックが解除された後の送信順序について保証はありますか?