Go 语言 sync.WaitGroup 简单使用

yufei       4 年, 11 月 前       1541

小学的我们,都有一大堆的小伙伴一起上下学,有时候某个小伙伴可能起床迟了,那么我们就要等他,然后再一起开开心心上学。

Go 语言 sync.WaitGroup 的就是用来 等待 这个过程。

sync.WaitGroup 的实例有 3 个方法

方法 说明
Add(number) 用于添加一个等待,number 最好设定为 1,如果你设定为其它数值,则需要相应的数量的 Done() 才能结束等待
Done() 用于完成一个等待,每次调用,会将等待数值 -1
Wait() 开始等待,当等待数值为 0 时则结束等待,继续执行后面的代码

注意点

  1. 如果使用闭包,那么 sync.WaitGroup 必须传递指针,例如

    go func(wg *sync.WaitGroup) {}(&wg)

  2. Add() 方法最好设定为 1,否则要相应的 Done() 调用,因为 Done() 每次只会 -1

  3. 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 上学咯......
目前尚无回复
简单教程 = 简单教程,简单编程
简单教程 是一个关于技术和学习的地方
现在注册
已注册用户请 登入
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.