sync.WaitGroup是一个同步原语,用于等待一组并发任务结束。它常用于并发程序中,让主程序在启动一组goroutine后等待它们结束。主要作用是:在并发程序启动一组任务后,等待它们全部结束,以防止程序退出时仍有任务没有完成。
用法示例如下:
go
package main
import (
"sync"
"fmt"
)
func main() {
var wg sync.WaitGroup
//启动3个goroutine,并递增waitgroup计数器
wg.Add(3)
go func() {
defer wg.Done() //goroutine结束时递减计数器
fmt.Println("1st goroutine sleeping...")
time.Sleep(1)
}()
go func() {
defer wg.Done()
fmt.Println("2nd goroutine sleeping...")
time.Sleep(2)
}()
go func() {
defer wg.Done()
fmt.Println("3rd goroutine sleeping...")
time.Sleep(3)
}()
//等待所有goroutine结束
wg.Wait()
fmt.Println("All goroutines complete.")
}
输出:
1st goroutine sleeping...
2nd goroutine sleeping...
3rd goroutine sleeping...
All goroutines complete.
整个流程如下:
1. 主程序启动3个goroutine,并调用wg.Add(3)将waitgroup计数器设置为3.
2. 每个goroutine结束时调用defer wg.Done()递减计数器。
3. 主程序调用wg.Wait()进行等待。
4. 等待所有goroutine调用wg.Done()将计数器减到0。
5. wg.Wait()函数返回,程序继续执行。
6. 最后输出"All goroutines complete."。
所以WaitGroup用于让主程序等待一组goroutine结束,实现了阻塞直至所有任务结束的效果。这在并发程序的结尾处尤为重要,可以避免主程序过早退出导致任务没有完成。