golang select 的 case 执行顺序

问题:

golang select 结构,假如底下有三个case,分别从 chan1, chan2, chan3 读取内容,chan1, chan2, chan3都是非阻塞的,那么是会先进入第一个 case,其它case还会再进入吗 ?


在 Go 语言中,select 语句用于监控多个通道的操作,并在其中一个操作准备好时执行相应的 case。

如果多个 case 同时就绪,会选择一个执行,具体选择哪个 case 是随机的,无法预测。

 

对于非阻塞的通道读取(即通道中有值可读或写入不会导致阻塞时),select 的行为如下:

  1. 非阻塞: 如果chan1, chan2, 和 chan3 都是非阻塞的,并且在检查时都已有数据可读,则select会随机选择一个case执行。这意味着首次执行时可能进入chan1的case,但后续循环中也可能进入chan2或chan3的case。

  2. 循环执行: 在一次 select 执行完毕后,如果程序逻辑使其再次进入 select 语句,只要这些通道中仍有数据可读,其他未被选中的 case 仍有机会被执行。select会持续监控所有列出的case,每次选择一个准备好的case执行。

  3. 并发性: 如果在执行某个case的过程中,其他channel变得可读,但在当前select语句执行完成之前,这些新就绪的case不会被处理,需要等到下一次select检查时才有可能被选中执行。

  4. default case: 如果存在default子句,当所有列出的channel都没有准备好进行读写操作时,将执行default分支。这为 select 提供了在没有通道操作可执行时的一个备选路径。

 

总结来说,如果chan1, chan2, 和 chan3 都是非阻塞且有数据,每个循环迭代中 select 都会随机选择一个case执行,所有case都有机会被执行,但具体哪个先执行是不确定的。

Other: golang select 和外层的 for 搭配

 

Link:https://www.cnblogs.com/farwish/p/18236149

posted on 2024-06-06 22:06  ercom  阅读(19)  评论(0编辑  收藏  举报