文章題目:
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: 最后吐槽下,這篇文章的程序排版真是不爽。