1. 程式人生 > >go隨聊-sync.WaitGroup

go隨聊-sync.WaitGroup

        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