channel[通道]是golang的一種重要特性,正是因為channel的存在才使得golang不同於其它語言。channel使得併發程式設計變得簡單容易有趣。
channel的概念和語法
乙個channel可以理解為乙個先進先出的訊息佇列。channel用來在協程[goroutine]之前傳遞資料,準確的說,是用來傳遞資料的所有權。乙個設計良好的程式應該確保同一時刻channel裡面的資料只會被同乙個協程擁有,這樣就可以避免併發帶來的資料不安全問題[data races]。
正文channel主要是用於多個goroutine之間通訊
channel語法
channel是引用型別,需要實用make來建立channel,如下
make(chan type, [buffer])
chan type 通道的型別
buffer 是可選引數,代表通道緩衝區的大小(省略則代表無緩衝)
向channel裡面寫入資料使用
q := make(chan bowww.cppcns.comol)
q從channel裡面讀取資料也是使用
q := make(chan bool)
有緩衝channel的使用
我們一直使用的無緩衝的channel,今天主要學習下有快取的channel。
無緩衝的channel,寫入資料後一定要有goroutine 從channel讀取資料後再寫入,否則程式會panic。
func main()
start 1
test code
9end 10
從執行結果上看,是第9個goroutine首先執行完畢了。程式也正常退出了。但是我們看到,加上主goroutine,記憶體中一共有11個goroutine,程式退出的時候還有10個goroutine,減去乙個主goroutine,還有9個goroutine沒有退出,這個對程式來說是不允許,可能會洩漏或者長期占用資源不釋放。
但是我們如果使用了有緩衝的channel,就可以利用channel的緩衝機制正常退出全部的goroutine了。
看下**
func test(wg *sync.waitgroup,ch chan int,i int)
fmt.println(
列印success的時候,第乙個goroutine已經將任務完成,迴圈9次將channel裡面的資料讀取出來,保證建立的go都不會阻塞能夠正常退出來。
golang中併發sync和channel
golang中實現併發非常簡單,只需在需要併發的函式前面新增關鍵字 go 但是如何處理go併發機制中不同goroutine之間的同步與通訊,golang 中提供了sync包和channel機制來解決這一問題 sync 包提供了互斥鎖這類的基本的同步原語.除 once 和 waitgroup 之外的型...
golang中併發sync和channel
golang中實現併發非常簡單,只需在需要併發的函式前面新增關鍵字 go 但是如何處理go併發機制中不同goroutine之間的同步與通訊,golang 中提供了sync包和channel機制來解決這一問題 sync 包提供了互斥鎖這類的基本的同步原語.除 once 和 waitgroup 之外的型...
golang中併發sync和channel
golang中實現併發非常簡單,只需在需要併發的函式前面新增關鍵字 go 但是如何處理go併發機制中不同goroutine之間的同步與通訊,golang 中提供了sync包和channel機制來解決這一問題 sync 包提供了互斥鎖這類的基本的同步原語.除 once 和 waitgroup 之外的型...