問題

私はすべて同じメッセージを受け取るチャンネルのスライスを持っています:

 func broadcast(c <-chan string, chans []chan<- string) {
    for msg := range c {
        for _, ch := range chans {
            ch <- msg
        }
    }
}
 

しかし、chansの各チャンネルは潜在的に別のレートで読み込まれているため、遅い消費者を得るときに他のチャンネルをブロックしたくありません。私はgoroutinesでこれを解決しました:

 func broadcast(c <-chan string, chans []chan<- string) {
    for msg := range c {
        for _, ch := range chans {
            go func() { ch <- msg }()
        }
    }
}
 

しかし、各チャンネルに渡されるメッセージの順序は重要です。私は仕様を見て、チャンネルがブロックされたときに注文を保持しているかどうかを調べました。

容量が 0 より大きい場合、チャネルは非同期です。

私にとって、書き込みがブロックされている場合、それは「送信」されるのではなく、送信されるのを待っています。その仮定では、上記は、複数のゴルーチンが書き込み中にブロックされたときに送信する順序については何も言いません。

チャンネルがブロックされなくなった後の送信の順序についての保証はありますか?

  ベストアンサー

保証はない

チャンネルがいっぱいになっていなくても、2つのゴルーチンが同時に送信された場合、最初に開始されたゴルーチンが実際に最初に実行されるという保証はないと思います。したがって、順番に到着したメッセージを数えることはできません。

  同じタグがついた質問を見る

gochannelgoroutine