golang 中 sync包的 WaitGroup

Posted 星火燎原智勇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang 中 sync包的 WaitGroup相关的知识,希望对你有一定的参考价值。

  golang 中的 sync 包有一个很有用的功能,就是 WaitGroup

  先说说 WaitGroup 的用途:它能够一直等到所有的 goroutine 执行完成,并且阻塞主线程的执行,直到所有的 goroutine 执行完成。

  WaitGroup 总共有三个方法: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)
            EchoNumber(n)
        }(i)
    }

    wg.Wait()
}

func EchoNumber(i int) {
    time.Sleep(3e9)
    fmt.Println(i)
}

结果如下所示:

0
1
2
3
4

  程序很简单,只是将每次循环的数量过 3秒钟 输出。那么,这个程序如果不用 WaitGroup,那么将看不见输出结果。因为 goroutine 还没执行完,主线程已经执行完毕。注释的 defer wg.Done() 和 defer wg.Add(-1) 作用一样。这个很好,原来执行脚本,都是使用 time.Sleep,用一个估计的时间等到子线程执行完。WaitGroup 很好。虽然 chanel 也能实现,但是觉得如果涉及不到子线程与主线程数据同步,这个感觉不错。

 

以上是关于golang 中 sync包的 WaitGroup的主要内容,如果未能解决你的问题,请参考以下文章

golang中sync.WaitGroup的使用

golang-----golang sync.WaitGroup解决goroutine同步

Golang的sync.WaitGroup 实现逻辑和源码解析

Golang sync.WaitGroup 简介与用法

Golang WaitGroup源码分析

golang/go语言sync同步包中的WaitGroup等待组Mutex互斥锁和RWMutex读写锁