Golang的多路选择和超时控制

5 篇文章 0 订阅

Flutter、Golang、Python、编译原理、算法、Chrome原理学习系列文章抢先看请关注【码农帮派】

【Golang学习系列文章,请扫二维码】

多路选择

Golang中的多路选择机制使用select关键字实现:

上面的代码可以看到,case后面的是阻塞事件,每个case都会从一个Channel上等待一个消息,当程序运行到select的时候,只要任意一个case的Channel处于非阻塞状态(即Channel中已经有消息可以直接获取而需要阻塞等待),那么select就会执行这个case所定义的代码块,并结束select,要是所有的case都处于阻塞状态,那么就会运行default的代码块。

 

假如select没有定义default,那么就会等到直到首先有一个case的Channel处于非阻塞状态,并运行那个case的代码块,然后结束select。

 

需要注意的是,执行select的时候,要是所有的case都已经处于非阻塞状态,不能根据case的顺序来判断会执行哪一个case:

上面的两个case分别从两个不同的Channel中获取数据,两个Channel阻塞的时长相同,多次运行代码:

 

超时控制

利用select多路选择的原理,我们可以设置一种超时控制,当我们不希望Channel阻塞的时间过长,就可以使用多路选择。

上面代码中的select会从retCh通道中获取结果数据,通过time.After()阻塞的控制retCh的超时时间,当程序运行到select的时候,两个case都处于阻塞状态,100MS之后,第二个case的Channel会转为非阻塞状态,从而控制第一个case的Channel的超时时长。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值