WaitGroup 的用法和实现原理
WaitGroup 的用法和实现原理
提示
题眼: 多任务同时执行。

WaitGroup 用于同步多个 goroutine。启动多个任务后,主 goroutine 可以调用 Wait 阻塞等待,直到所有子任务执行完成。
它的底层主要依赖原子操作和运行时信号量,内部核心是一个 64 位状态值:
- 高 32 位记录计数器。
- 低 32 位记录等待中的 goroutine 数量。
它对外最常用的三个方法是:
Add:增加计数。Done:减少计数,本质上等价于Add(-1)。Wait:阻塞等待,直到计数归零。
使用时需要注意:
Add和Done必须配平,否则可能永久阻塞或直接panic。WaitGroup不能在使用后随意复制。- 单独使用
WaitGroup无法处理错误传播和联动取消。
重要
参考答案:
WaitGroup 是 Go 里最常见的协程同步工具之一,它的作用很直接,就是让父 goroutine 等待一组子 goroutine 都执行完,再继续往下走。
它的实现并不复杂,核心是一个 64 位状态字段,高 32 位记任务数量,低 32 位记等待者数量。Add 和 Done 通过原子操作修改计数,Wait 则在计数不为 0 时进入阻塞,等到计数清零后由运行时唤醒。
它最需要注意的就是使用规范。Add 和 Done 必须一一对应,否则要么一直等不到结束,要么直接把计数减成负数导致 panic。另外,WaitGroup 只负责等待,不负责取消,也感知不到子协程里的错误。
所以在稍复杂一点的业务里,如果需要“谁出错了就通知其他协程一起收尾”,通常都会把 errgroup 和 Context 配合起来使用。
相关信息
引申: ErrGroup 是什么?
