go隨聊-sync.WaitGroup
阿新 • • 發佈:2018-11-01
GO提供了sync包和channel來解決協程同步和通訊。新手對channel通道操作起來更容易產生死鎖,如果時緩衝的channel還要考慮channel放入和取出資料的速率問題。sync.WaitGroup是等待一組協程結束,它實現了一個類似任務佇列的結構,你可以向佇列中加入任務,任務完成後就把任務從佇列中移除,如果佇列中的任務沒有全部完成,佇列就會觸發阻塞以阻止程式繼續執行。本文主要介紹sync.WaitGroup。
package sync
type WaitGroup struct 三個重要函式:
//呼叫Add來設定等待的協程(goroutine)數量 func (wg *WaitGroup) Add(delta int) //協程(goroutine)完成後呼叫Done,內部其實就是將值-1 func (wg *WaitGroup) Done() //Wait用來阻塞即等待wg值為0,直到所有協程(goroutine)完成才會向下執行 func (wg *WaitGroup) Wait()
使用例子
定義任務及WaitGroup
var wg sync.WaitGroup
//任務每個1秒列印一次,列印5次
func process(name string) {
for i:=0;i<5;i++ {
fmt.Println("process[",name,"] count[",i+1,"]")
time.Sleep(time.Second)
}
//協程完成後呼叫Done即計數器-1
wg.Done()
}
啟動任務
fmt.Println("start") wg.Add(1) //啟動任務worker1 go process("worker1") wg.Add(1) //啟動任務worker2 go process("worker2") //等待所有任務完成 wg.Wait() fmt.Println("exit") ---------------------------------- start process[ worker2 ] count[ 1 ] process[ worker1 ] count[ 1 ] process[ worker1 ] count[ 2 ] process[ worker2 ] count[ 2 ] process[ worker2 ] count[ 3 ] process[ worker1 ] count[ 3 ] process[ worker1 ] count[ 4 ] process[ worker2 ] count[ 4 ] process[ worker2 ] count[ 5 ] process[ worker1 ] count[ 5 ] exit