文章目錄
- 多路監聽
- 超時控制
多路監聽
- 如果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的管道