Golang的多路选择和超时控制
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的超时时长。