天天看點

Go語言學習筆記(七)殺手锏 Goroutine + ChannelGoroutineChannelGoroutine+Channel 栗子

加 Golang學習 QQ群共同學習進步成家立業工作 ^-^ 群号:96933959

Go語言的主要的功能在于令人簡易使用的并行設計,這個方法叫做Goroutine,通過Goroutine能夠讓你的程式以異步的方式運作,而不需要擔心一個函數導緻程式中斷,是以Go語言也非常地适合網絡服務。

我們通過go讓其中一個函數同步運作,如此就不需要等待該函數運作完後才能運作下一個函數。

Goroutine是類似線程的概念(但Goroutine并不是線程)。線程屬于系統層面,通常來說建立一個新的線程會消耗較多的資源且管理不易。而 Goroutine就像輕量級的線程,但我們稱其為并發,一個Go程式可以運作超過數萬個 Goroutine,并且這些性能都是原生級的,随時都能夠關閉、結束。一個核心裡面可以有多個Goroutine,通過GOMAXPROCS參數你能夠限制Gorotuine可以占用幾個系統線程來避免失控。

在内置的官方包中也不時能夠看見Goroutine的應用,像是net/http中用來監聽網絡服務的函數實際上是建立一個不斷運作循環的Goroutine。

GOMAXPROCS 在排程程式優化後會去掉,預設用系統所有資源。

應用場景,如果某個goroutine panic了,而且這個goroutine裡面沒有捕獲(recover),那麼整個程序就會挂掉。是以,好的習慣是每當go産生一個goroutine,就需要寫下recover。

<a></a>

channel,管道、隊列,先進先出,用來異步傳遞資料。channel加上goroutine,就形成了一種既簡單又強大的請求處理模型,使高并發和線程同步之間代碼的編寫變得異常簡單。

線程安全,多個goroutine同時通路,不需要加鎖。

channel是有類型的,一個整數的channel隻能存放整數。

開啟一個goroutine來放入初始化未指定大小的chan不會報錯。

即放即走,在等放入時有來拿資料的,就直接拿走。

關閉chan後再放入資料會 panic: send on closed channel。

chan不關閉取超資料的情況會報 deadlock

chan關閉的情況取超出值為類型預設值,如int為0

判斷chan是否取完

利用select來處理chan逾時。

time.After()定時器來做處理。

在time.After()計時器觸發之前,底層計時器不會被垃圾收集器回收。

 定時器栗子

多個goroutine處理任務;

等待一組channel的傳回結果。

等待一組channel的傳回結果 sync.WaitGroup 的解決方法。

WaitGroup用于等待一組線程的結束。父線程調用Add方法來設定應等待的線程的數量。每個被等待的線程在結束時應調用Done方法。同時,主線程裡可以調用Wait方法阻塞至所有線程結束。