文章目录
- 多路监听
- 超时控制
多路监听
- 如果selcet外面没有for循环,则只会监听一次,要实现一直监听的话要加for循环
- 但是如果要设置退出条件的话,break语句只会退出这个select而不会退出for循环
- select也可以有default,用于不用等channel的阻塞的情况,也就是如果有数据我就读如果没有数据我也不想要被阻塞的情况,速度很快
超时控制
-
有时候我们的函数可能会执行很长一段时间,我们希望能有一个最长执行时间的控制,超过这个时间后我都不想再继续等了
-
第一种做法:时间到了之后往channel放入元素
- 第二种方法:time.After,会返回一个只读的channel,当等设定好的一段时间后,会往返回的channel放入元素
- 第三种方案:借助context,context.WithCancel,ctx里面有done方法,会返回只读channel,没有元素,但是我们显式执行cancel之后会关闭done返回的channel,也不会使select阻塞
- 第四种方法:context.WithTimeout,当超时,会直接关闭ctx的管道