小学的我们,都有一大堆的小伙伴一起上下学,有时候某个小伙伴可能起床迟了,那么我们就要等他,然后再一起开开心心上学。
Go 语言 sync.WaitGroup
的就是用来 等待 这个过程。
sync.WaitGroup
的实例有 3 个方法
方法 | 说明 |
---|---|
Add(number) |
用于添加一个等待,number 最好设定为 1 ,如果你设定为其它数值,则需要相应的数量的 Done() 才能结束等待 |
Done() |
用于完成一个等待,每次调用,会将等待数值 -1 |
Wait() |
开始等待,当等待数值为 0 时则结束等待,继续执行后面的代码 |
注意点
-
如果使用闭包,那么
sync.WaitGroup
必须传递指针,例如go func(wg *sync.WaitGroup) {}(&wg)
-
Add()
方法最好设定为1
,否则要相应的Done()
调用,因为Done()
每次只会-1
-
Add()
的调用要在等待的事情开始前,一般来说就是在go func(){}
之前调用,而Done()
则在等待的时间结束时调用,一般是go func(){}
的最后一条语句
范例
package main import ( "log" "sync" "time" "math/rand" ) func main() { wg := &sync.WaitGroup{} classmate := []string{"小明","小红","小王","小刚","小唐"}; for _, name := range classmate { wg.Add(1) // 加入等待队列 go func(wg *sync.WaitGroup, name string) { t := rand.Intn(10) log.Printf("%s 还要稍等 %d 秒",name,t) time.Sleep(time.Duration(t) * time.Second) wg.Done() log.Printf("%s 准备好了",name) }(wg, name) } log.Println("开始等待小伙伴么....") wg.Wait() log.Println("上学咯......") }
输出结果如下
2019/12/08 10:11:25 开始等待小伙伴么.... 2019/12/08 10:11:25 小明 还要稍等 7 秒 2019/12/08 10:11:25 小刚 还要稍等 7 秒 2019/12/08 10:11:25 小红 还要稍等 1 秒 2019/12/08 10:11:25 小唐 还要稍等 9 秒 2019/12/08 10:11:25 小王 还要稍等 1 秒 2019/12/08 10:11:26 小王 准备好了 2019/12/08 10:11:26 小红 准备好了 2019/12/08 10:11:32 小明 准备好了 2019/12/08 10:11:32 小刚 准备好了 2019/12/08 10:11:34 小唐 准备好了 2019/12/08 10:11:34 上学咯......
目前尚无回复