sync.WaitGroup是等待一组协程结束。它实现了一个类似任务队列的结构,可以向队列中加入任务,任务完成后就把任务从队列中移除,如果队列中的任务没有全部完成,队列就会触发阻塞以阻止程序继续运行。 **sync.WaitGroup只有3个方法,Add(),Done(),Wait()**。
其中Done()是Add(-1)的别名,使用Add()添加计数,Done()减掉一个计数,计数不为0, 阻塞Wait()的运行。
示例:
package main
import (
"fmt"
"sync"
"time"
)
var group sync.WaitGroup
func sayHello() {
for i := 0; i < 5; i++ {
fmt.Println("hello......")
time.Sleep(time.Second)
}
//线程结束 -1
group.Done()
}
func sayHi() {
//线程结束 -1
defer group.Done()
for i := 0; i < 5; i++ {
fmt.Println("hi......")
time.Sleep(time.Second)
}
}
func main() {
//+2
group.Add(2)
fmt.Println("main正在阻塞...")
go sayHello()
fmt.Println("main持续阻塞...")
go sayHi()
//线程等待
group.Wait()
fmt.Println("main貌似结束了阻塞...")
}
效果: