golang的sync的包有一個功能WaitGroupgolang
做用:異步
阻塞主線程的執行,直到全部的goroutine執行完成,說白了就是必須同步等待全部異步操做完成!!!spa
三個方法:線程
Add:添加或者減小等待goroutine的數量blog
Done:至關於Add(-1)同步
Wait:執行阻塞,直到全部的WaitGroup數量變成0it
example:class
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) }
程序很簡單,只是將每次循環的數量過3秒鐘輸出。那麼,這個程序若是不用WaitGroup,那麼將看不見輸出結果。由於goroutine還沒執行完,主線程已經執行完畢。註釋的defer wg.Done()和defer wg.Add(-1)做用同樣。import
這個很好,原來執行腳本,都是使用time.Sleep,用一個估計的時間等到子線程執行完。WaitGroup很好。雖然chanel也能實現,可是以爲若是涉及不到子線程與主線程數據同步,這個感受不錯。循環