gpt4 book ai didi

go - go channels 在被阻塞时会保留顺序吗?

转载 作者:IT王子 更新时间:2023-10-29 01:12:44 26 4
gpt4 key购买 nike

我有一部分 channel 都收到相同的消息:

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

但是,由于 chans 中的每个 channel 都可能以不同的速率被读取,所以我不想在遇到速度较慢的消费者时阻塞其他 channel 。我已经用 goroutines 解决了这个问题:

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

但是,传递到每个 channel 的消息的顺序很重要。我查看了规范以查看 channel 在被阻止时是否保持顺序,我发现的是:

If the capacity is greater than zero, the channel is asynchronous: communication operations succeed without blocking if the buffer is not full (sends) or not empty (receives), and elements are received in the order they are sent.

对我来说,如果写入被阻塞,那么它不是“已发送”,而是等待发送。有了这个假设,当多个 goroutine 在写入时被阻塞时,上面没有提到发送顺序。

channel 畅通后发送的顺序是否有任何保证?

最佳答案

不,没有任何保证。

即使 channel 未满,如果同时启动两个 goroutine 向其发送数据,我认为也不能保证先启动的 goroutine 会先执行。因此,您不能指望消息会按顺序到达。

关于go - go channels 在被阻塞时会保留顺序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15858658/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com