Go開發(fā) Channel 徹底研究之Select基礎(chǔ)
為什么需要select?
有時(shí)會(huì)遇到這種情景:需要對(duì)多個(gè)channel進(jìn)行監(jiān)聽。

如圖所示,就像一個(gè)人監(jiān)聽多個(gè)通道一樣,假如采用for循環(huán)形式
這個(gè)方式肯定走不通,原因是一旦某個(gè)通道監(jiān)聽阻塞了,下面的部分都不會(huì)執(zhí)行到。有沒有一種方法,像治安巡查一樣一輪輪的輪詢,那么就可以解決這個(gè)問題了。
go提供了select,正對(duì)應(yīng)輪詢的思路,模式如下:
運(yùn)行過程
從上往下“巡查”,如果發(fā)現(xiàn)哪個(gè)case處于可執(zhí)行狀態(tài),就執(zhí)行該條語(yǔ)句,那么其余語(yǔ)句就不執(zhí)行了。
如果都不能執(zhí)行,且有default語(yǔ)句時(shí),就執(zhí)行default
如果沒有default語(yǔ)句,那么select整個(gè)就會(huì)阻塞(導(dǎo)致所在協(xié)程阻塞),直到解除。
但有人會(huì)有疑問,上面這些語(yǔ)句不是只能輪詢一次嗎?這個(gè)容易解決,我們給select外層再加一個(gè)for循環(huán),這樣就可以無(wú)限的輪詢。
模式基本形成了。
客戶和服務(wù)端交互模擬
下面先看一個(gè)基礎(chǔ)的例子,主要用來(lái)模仿客戶和服務(wù)端的交互,模型如下:

分析
- 服務(wù)端需要持續(xù)服務(wù),因此采用for無(wú)限循環(huán)形式
- 客戶端的返回值就是和超時(shí)進(jìn)行速度PK。




























