天天看點

[閱讀筆記]Go語言并發之美

文章題目:

     go語言并發之美

文章連結:

   http://qing.weibo.com/2294942122/88ca09aa33002ele.html

分享筆記:

     這篇文章說的是go routine和channel在go語言中的應用。剛開始看的時候,對文章使用lua的協程來描述goroutine還真是不習慣。建議讀者不要跟者作者使用這樣的稱呼。

并發在go中得到語言級别的支援。文章列出了幾個goroutine和channel的使用方法

1 id生成器

由于id生成器會産生系統調用,是以假設生成随機數這個id生成函數需要很長時間。這個時候就可以使用到并發了。當一個goroutine在運作的時候,另外一個id生成的goroutine在生成id。

2 多路複用

多路複用就是一個動作可以管理或者監聽多個并發線程(這裡是goroutine)。文中的例子就是使用一個chan來監聽多個goroutine,一旦有一個goroutine對chan進行操作,下面的程式就進行了。

例子的最後也說了,實際上go也提供了select關鍵字,是以多路複用也可以使用select來對多個chan進行監聽,每個goroutine來通過一個chan來傳遞消息。

3 實作并發中的future技術

future技術是一種并發模式,需要并發處理的時候,建立goroutine傳回一個future,當需要這個future傳回東西的時候,去future中擷取資料。這樣的好處就是在程式設計的時候的思維邏輯是流式的了。

4 并發循環

使用goroutine來提高循環的效率是最容易想到的優化效率的方法了。

5 chainfilter技術

并發的過濾器可以使用goroutine來使用。這個記得nginx的output就是使用chainfilter這樣的模式來實作。

6 共享變量

并發過程中的共享變量的使用有可能發生沖突。當然首選會想到使用鎖來對共享變量進行控制。

在golang中也可以使用channel來維護共享變量,實際達到的也是鎖的功效。

文中的例子使用一個寫通道和一個讀通道來保持一個共享變量,隻能從寫通道寫入,這個時候,其他的goroutine要使用寫通道是不行的,這就達到了寫鎖的功能。讀的功能也是一樣的。

7 使用逾時來控制協程洩露

協程洩露說的是協程沒有合理控制結束(回收)導緻協程無法結束,最終導緻程式阻塞無法執行了。

這種情況可以使用逾時,使用逾時就是另外開啟一個goroutine來計時,主goroutine使用多路複用監聽要監聽的goroutine和計時goroutine。記得某個講goroutine并發的視訊也說到這個。在實際項目中,記得給每個可能“洩露”的goroutine加上計時器是尤為重要的。

ps: 最後吐槽下,這篇文章的程式排版真是不爽。