1. 程式人生 > 其它 >Golang語言社群-併發模型和應用場景

Golang語言社群-併發模型和應用場景

Golang語言社群-併發模型和應用場景

生成器

在Python中我們可以使用yield關鍵字來讓一個函式成為生成器,在Go中我們可以使用通道來製造生成器(一種lazy load類似的東西)。

當然我們的通道並不是簡單的做阻塞主線的功能來使用的哦。

下面是一個製作自增整數生成器的例子,直到主線向通道索要資料,我們才新增資料到通道:

這不禁叫我想起了Python中可愛的xrange, 所以給了生成器這個名字!

服務化

比如我們載入一個網站的時候,例如我們登入新浪微博,我們的訊息資料應該來自一個獨立的服務,這個服務只負責 返回某個使用者的新的訊息提醒。

如下是一個使用示例:

多路複合

上面的例子都使用一個通道作為返回值,可以把通道的資料合併到一個通道的。 不過這樣的話,我們需要按順序輸出我們的返回值(先進先出)。

如下,我們假設要計算很複雜的一個運算 100-x , 分為三路計算, 最後統一在一個通道中取出結果:

select監聽通道

Go有一個語句叫做select,用於監測各個通道的資料流動。

如下的程式是select的一個使用例子,我們監視三個通道的資料流出並收集資料到一個通道中。

有了select, 我們在 多路複合中的示例程式碼中的函式fanIn還可以這麼來寫(這樣就不用開好幾個goroutine來取資料了):

使用select的時候,有時需要超時處理, 其中的timeout通道相當有趣:

結束標誌

在Go併發與並行筆記一我們已經講過通道的一個很重要也很平常的應用,就是使用無緩衝通道來阻塞主線,等待goroutine結束。

這樣我們不必再使用timeout。

那麼對上面的timeout來結束主線的方案作個更新:

菊花鏈

簡單地來說,資料從一端流入,從另一端流出,看上去好像一個連結串列,不知道為什麼要取這麼個尷尬的名字。。

菊花鏈的英文名字叫做: Daisy-chain, 它的一個應用就是做過濾器,比如我們來篩下100以內的素數(你需要先知道什麼是篩法)

程式有詳細的註釋,不再說明了。

隨機數生成器

通道可以做生成器使用,作為一個特殊的例子,它還可以用作隨機數生成器。如下是一個隨機01生成器:

定時器

我們剛才其實已經接觸了通道作為定時器, time包裡的After會製作一個定時器。

看看我們的定時器吧!