1、概述:sync.waitGroup用于等待一组线程的结束,实现同步阻塞,是值类型。在一组任务完成前,先阻塞线程,等这组任务完成后再解锁线程,继续执行后续操作。
2、主要方法:
创建waitGroup:
//由于sync.WaitGroup是值类型,所以可以用var直接声明,也可以用:=的格式创建
var wg sync.WaitGroup
wg := sync.WaitGroup{}
添加任务数量:wg.Add(任务数量)
wg.Add(5) //设置要等待的任务数量为5
减少任务数量(在些goroutine结束时执行):
wg.Done()
下面举个应用实例:
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
wg.Add(5) //添加等待线程数量
for i := 0; i < 5; i++ {
//开启新的goroutine,在goroutine运行结束时调用wg.Done()
go func(_wg *sync.WaitGroup, index int) {
defer _wg.Done() //减少等待的线程数量,需要在goroutine运行结束时调用,(可以用defer,不使用defer的话就需要把_wg.Done()放在函数的最后)
fmt.Printf("线程%d运行结束...\n", index)
}(&wg, i)
}
wg.Wait() //等待设置的线程数减少为0时,才会取消阻塞
fmt.Println("main函数运行结束...")
}
运行结果如下:
线程4运行结束...
线程1运行结束...
线程0运行结束...
线程2运行结束...
线程3运行结束...
main函数运行结束...