go - 我可以依赖基于发送顺序的选择唤醒顺序吗?

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

如果只有一个生产者,是否保证我们总是可以从 case:<-a 之前从 case:<-b 中检索 x?

最佳答案

是的,您可以依赖订单,因为 channel a是无缓冲的。

只有当发送方和接收方准备就绪时,无缓冲 channel 上的通信才会成功。发送方不执行语句 a <- x直到收到值。由此可见,这些值是按发送顺序接收的。

如果 channel a 则订单无法保证被缓冲。在发送两个值之前,接收器可能不会执行。当接收器在发送值后确实执行时,无法保证选择的哪个分支将首先执行。

关于go - 我可以依赖基于发送顺序的选择唤醒顺序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53510858/

相关文章:

go - 如何在不使用 DefaultServeMux 的情况下实现 HandlerFunc

go - 为什么错误类型上的类型开关不起作用?

golang 打开第二个终端/控制台

memory - goroutines 内存不足 UPD : go error handling

go - 与Google Photos API的竞争条件

go - 在 Golang 中无需声明结构即可从接口(interface)获取接口(interface)字段值

multithreading - goroutine 或多线程在 golang 中不起作用

function - 从 goroutine 返回值会发生什么

concurrency - goroutines 导致严重的减速和头痛

戈朗 : How to run the same logic at the beginning of every struct member functions?