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