golang 中 sync包的 WaitGroup
阿新 • • 發佈:2017-10-05
eight ack family height 線程 var 等待 one span
golang 中的 sync 包有一個很有用的功能,就是 WaitGroup
先說說 WaitGroup 的用途:它能夠一直等到所有的 goroutine 執行完成,並且阻塞主線程的執行,直到所有的 goroutine 執行完成。
WaitGroup 總共有三個方法:Add(delta int), Done(), Wait()。簡單的說一下這三個方法的作用。
Add:添加或者減少等待 goroutine 的數量
Done:相當於Add(-1)
Wait:執行阻塞,直到所有的WaitGroup數量變成 0
請看例子:
package main import ("fmt" "sync" "time" ) func main() { var wg sync.WaitGroup for i := 0; i < 5; i = i + 1 { wg.Add(1) go func(n int) { // defer wg.Done() defer wg.Add(-1) EchoNumber(n) }(i) } wg.Wait() } func EchoNumber(i int) { time.Sleep(3e9) fmt.Println(i) }
結果如下所示:
0 1 2 3 4
程序很簡單,只是將每次循環的數量過 3秒鐘 輸出。那麽,這個程序如果不用 WaitGroup,那麽將看不見輸出結果。因為 goroutine 還沒執行完,主線程已經執行完畢。註釋的 defer wg.Done() 和 defer wg.Add(-1) 作用一樣。這個很好,原來執行腳本,都是使用 time.Sleep,用一個估計的時間等到子線程執行完。WaitGroup 很好。雖然 chanel 也能實現,但是覺得如果涉及不到子線程與主線程數據同步,這個感覺不錯。
golang 中 sync包的 WaitGroup