WaitGroup:它能够一直等到所有的goroutine执行完成,并且阻塞主线程的执行,直到所有的goroutine执行完成。
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)
hold3Seconds(n)
}(i)
}
wg.Wait()//拖住主线程,直到waitgroup=0
}
func hold3Seconds(i int) {
time.Sleep(3e9)
fmt.Println(i)
}
简单不做详细解释了,其实channel也可以实现,如果不需要子线程与主线程数据同步,这个更方便点。