Golang的并发控制-WaitGroup

使用sync.WaitGroup控制并发

示例:

package main

import (
    "fmt"
    "time"
    "sync"
)

func main() {
    var wg sync.WaitGroup

    // 一般会使用for循环,每次调用 wg.Add(1)来添加一个信号量
    wg.Add(2) //设置计数器,数值即为goroutine的个数,直接设置2
    go func() {
        //Do some work
        time.Sleep(1*time.Second)

        fmt.Println("Goroutine 1 finished!")
        wg.Done() //goroutine执行结束后将计数器减1
    }()

    go func() {
        //Do some work
        time.Sleep(2*time.Second)

        fmt.Println("Goroutine 2 finished!")
        wg.Done() //goroutine执行结束后将计数器减1
    }()

    wg.Wait() //主goroutine阻塞等待计数器变为0
    fmt.Printf("All Goroutine finished!")
}

小结

WaitGroup一般是使用在等待一组“工作协程”结束的场景,其三个方法分工如下

  • Add(delta int) 增加工作协程,需要启动工作协程时调用
  • Done() 减少工作协程,每次调用减少相应的值,默认是:1
  • Wait() 等待工作协程完成,即 add 添加的 和 done 减少的 结果到0