Please enable JavaScript.
Coggle requires JavaScript to display documents.
go routine - Coggle Diagram
go routine
channel
一條管線
可以推進變數
也可以從其中拉變數出來
並且會等待到另外一端完成推入或拉出動作後
才繼續動作
而非使用lock.unlock等明顯的方法
會造成阻塞的情況
有個goroutine推資料進入channel
直到其他goroutine把該資料從channel中拉出來
他都不能走
channel中沒有資料
但是code又要該goroutine拉資料時
他會等到有資料才繼續動作
unbuffered channel
推入一個資料會造成推入方的等待
拉出時沒有資料會造成拉出方的等待
使用 Unbuffered Channel 的壞處是:如果推入方的執行一次的時間較拉取方短,會造成推入方被迫等待拉取方才能在做下一次的處理,這樣的等待是不必要並且需要被避免的。
buffered channel
Buffered Channel 的宣告會在第二個參數中定義 buffer 的長度,它只會在 Buffered 中資料填滿以後才會阻塞造成等待
也就是預留推入的空間
當成一個小倉庫
在loop中的channel
可以藉由第二個回傳值 ok 確認 Channel 是否被關閉,如果被關閉的話代表此 Channel 已經不再使用,可以結束巡覽。
如果對 Closed Channel 推入資料的話會造成 Panic
在多執行緒之下的共享變數
共享變數最大的問題就是
可能會有資訊不同步的情況
使用XORlock互斥鎖保證變數存取安全
要存取變數前使用lock
存取變數
存取完之後使用unlock
其他人始可存取該變數
使用channel保證變數存取安全
因為 Channel 推入及拉出時等待的特性
被拉出來做計算的值會保證是安全的
此法因為必須拉出channel後才做運算
所以使用非立即阻塞的 Buffered Channel
語法
go function(x,y,z)
main()也是執行在goroutine上,當main結束後,其他的goroutine也會強制結束
因為main()可能會突然結束,導致其他goroutine被迫結束,為了避免這種狀況,就會需要等待
等待方法:
1.time.sleep()
強制休眠,有點像delay
因為需要手動設時間,
太長拖時間,太短沒效果,不好用
2.sync.WaitGroup
可以wg.add(interger)
增加counter計數數量
當goroutine執行一次
可以用wg.Done()減少一次
中間可以使用wg.Wait等待counter歸零
優點 不用自己算時間
缺點 需要自己算次數
3.channel阻塞
使用channel本身的阻塞特性
讓routine好像在等待
優點 不用自己算時間
語法簡潔
為最主要golang中實現等待的方式
golang 的多執行緒