加 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方法阻塞至所有線程結束。