golang的sync的包有一個功能WaitGroup
作用:
阻塞主線程的執行,直到所有的goroutine執行完成,說白了就是必須同步等待所有異步操作完成!!!
三個方法:
Add:添加或者減少等待goroutine的數量
Done:相當於Add(-1)
Wait:執行阻塞,直到所有的WaitGroup數量變成0
example:
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)作用一樣。
這個很好,原來執行腳本,都是使用time.Sleep,用一個估計的時間等到子線程執行完。WaitGroup很好。雖然chanel也能實現,但是覺得如果涉及不到子線程與主線程數據同步,這個感覺不錯。
