1. 程式人生 > >golang 中 sync包的 WaitGroup

golang 中 sync包的 WaitGroup

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