在golang中我们经常开启goroutine,很多新手可能踩过坑,明明开启了go func但是没有执行,函数就结束了。原因是主协程执行完毕返回结束整个进程,导致其他go func还没有执行就结束。对此种现象可以使用sleep解决,但是休息多久呢?1 微妙、1 毫秒、 1 秒这个无法确定,因为我们很难预测go func中需要执行多久,sleep过久导致浪费时间,sleep时间短了go func还没有执行完毕。这个时候sync.WaitGroup很好的解决了这个问题。WaitGroup官方是这样解释流程的:WaitGroup等待goroutine的集合完成。主goroutine调用Add来设置,等待的goroutines。 然后每个goroutines运行并在完成后调用完成。 同时,等待可用于阻塞,直到所有goroutine完成。首次使用后不得复制WaitGroup。
先看一个使用的demo
var i int64
wg := sync.WaitGroup{} //生成WaitGroup对象
wg.Add(2) //Add来设置要等待的协程数
for index := 0; index < 2; index++{
mu := &sync.Mutex{}
go func( ){
defer wg.Done() //Done当go func用于告知等待结束
mu.Lock()
defer mu.Unlock()
for num := 0; num < 10000; num++{
//atomic.AddInt64(&i,1)
i++
}
fmt.Println("i=",i)
}()
}
wg.Wait() //主协程进行等待
现在我们分析一下WaitGroup的原