我可以基于发送顺序来选择唤醒的顺序吗?

时间:2018-11-28 01:45:54

标签: go goroutine

想象一下如下代码模式:

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
...

是否可以保证总是从案例中检索x:<-a在案例y之前:<-b,前提是只有一个生产者?

1 个答案:

答案 0 :(得分:3)

是的,您可以依赖顺序,因为通道a没有缓冲。

仅当发送方和接收方准备就绪时,无缓冲通道上的通信才能成功。在接收到值之前,发送者不会执行超过语句a <- x的操作。由此可见,这些值是按发送顺序接收的。

如果缓冲了通道a,则不能保证顺序。在两个值都发送之前,接收器可能不会执行。当接收器在发送值后确实执行时,不能保证选择的哪个分支将首先执行。