什么是 WaitGroup
sync.WaitGroup
是 Go 语言标准库中提供的一个并发控制工具,用于等待一组 goroutine 完成执行。它本质上是一个计数器,可以跟踪正在运行的 goroutine 数量。
WaitGroup 有三个主要方法:
Add(delta int)
- 增加或减少等待的 goroutine 数量
Done()
- 相当于 Add(-1),表示一个 goroutine 已完成
Wait()
- 阻塞直到计数器归零
基本用法
WaitGroup 的常见误用
1. 在 goroutine 内部调用 Add
正确做法:在启动 goroutine 前调用 Add
2. Add 和 Wait 的调用顺序问题
正确做法:确保所有 Add 调用在 Wait 之前完成
3. 传递 WaitGroup 值而非指针
正确做法:传递 WaitGroup 指针
4. 计数器归零后重用
正确做法:WaitGroup 不能安全地重用,需要新建一个
WaitGroup + Channel 组合
结合 WaitGroup 和 Channel 可以实现更复杂的并发控制模式。
1. 限制并发数量
2. 收集 goroutine 结果
高级用法:动态调整并发数
总结
WaitGroup 是 Go 中管理 goroutine 生命周期的强大工具,但需要注意:
- 总是使用指针传递 WaitGroup
- 在启动 goroutine 前调用 Add
- 不要重用 WaitGroup
- 结合 Channel 可以实现更精细的并发控制
通过合理使用 WaitGroup 和 Channel 的组合,可以构建出高效且安全的并发程序。