我可以依赖 select 基于发送顺序的唤醒顺序吗?
Can I rely on the order of select wake ups based on sending order?
想象如下代码模式:
var a chan T = make(chan T)
var b chan Q = make(chan Q)
//consumer goroutine
for {
select {
case <-a:
//...
case <-b:
//...
}
}
//producer goroutine
...
a <- x
b <- y
...
如果只有一个生产者,是否保证我们始终可以从 case:<-a 中检索 x,然后从 case:<-b 中检索 y?
是的,您可以依赖订单,因为通道 a
是无缓冲的。
只有当发送方和接收方准备就绪时,无缓冲通道上的通信才会成功。在收到值之前,发送方不会执行语句 a <- x
。由此可见,这些值是按发送顺序接收的。
如果通道 a
被缓冲,则无法保证顺序。在发送两个值之前,接收器可能不会执行。当接收方在发送值后确实执行时,无法保证 select 的哪个分支将首先执行。
想象如下代码模式:
var a chan T = make(chan T)
var b chan Q = make(chan Q)
//consumer goroutine
for {
select {
case <-a:
//...
case <-b:
//...
}
}
//producer goroutine
...
a <- x
b <- y
...
如果只有一个生产者,是否保证我们始终可以从 case:<-a 中检索 x,然后从 case:<-b 中检索 y?
是的,您可以依赖订单,因为通道 a
是无缓冲的。
只有当发送方和接收方准备就绪时,无缓冲通道上的通信才会成功。在收到值之前,发送方不会执行语句 a <- x
。由此可见,这些值是按发送顺序接收的。
如果通道 a
被缓冲,则无法保证顺序。在发送两个值之前,接收器可能不会执行。当接收方在发送值后确实执行时,无法保证 select 的哪个分支将首先执行。