使用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