我有一部分频道都收到相同的消息:
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 }()
}
}
}
但是,传递到每个通道的消息的顺序很重要。我查看了规范以查看通道在被阻塞时是否保持顺序,我发现的只是:
如果容量大于零,则通道是异步的:如果缓冲区未满(发送)或非空(接收),则通信操作成功而不会阻塞,并且元素按发送顺序接收。
对我来说,如果写入被阻止,那么它不是“发送”,而是等待发送。有了这个假设,上面没有说明当多个 goroutine 被阻塞时的发送顺序。
通道畅通后,发送顺序是否有任何保证?