sync.WaitGroup
sync.WaitGroup 是 Go 语言标准库中提供的一个同步原语,用于在并发环境中协调多个 Goroutine 的执行顺序,确保所有并发任务完成后再继续执行后续逻辑。以下是 sync.WaitGroup 的使用方法:
-
创建 WaitGroup:
- 使用
sync.WaitGroup类型的零值创建一个实例,无需调用任何构造函数:var wg sync.WaitGroup
- 使用
-
添加计数:
- 在启动 Goroutine 之前,使用
Add()方法增加 WaitGroup 的计数器。传递一个正整数作为参数,表示即将启动的 Goroutine 数量。如果每个 Goroutine 对应一个任务,通常传入 1。wg.Add(1)
如果需要同时启动多个相同任务的 Goroutine,可以传入相应数量,如
wg.Add(5)表示将启动 5 个 Goroutine。 - 在启动 Goroutine 之前,使用
-
启动 Goroutine:
- 在增加计数后,启动 Goroutine 并在其内部执行相关任务。在 Goroutine 函数中,记得在任务完成后调用
Done()方法。go func() { // 任务代码 ... // 任务完成,通知 WaitGroup wg.Done() }()
- 在增加计数后,启动 Goroutine 并在其内部执行相关任务。在 Goroutine 函数中,记得在任务完成后调用
-
重复步骤 2 和 3:
- 如有多个不同类型的任务或多个批次的 Goroutine 需要同步,可以重复步骤 2 和 3,每次启动新的 Goroutine 前调用
Add(),并在对应的 Goroutine 内部任务完成后调用Done()。
-
等待所有任务完成:
-
在所有 Goroutine 启动完毕后,使用
Wait()方法阻塞当前 Goroutine(通常是主 Goroutine),直到 WaitGroup 的计数器归零(即所有 Goroutine 调用过Done())。wg.Wait() -
Wait()方法会阻塞,直到所有之前通过Add()添加的 Goroutine 完成任务并调用Done()减少了计数器。一旦计数器变为 0,Wait()返回,表明所有 Goroutine 已经完成,可以继续执行后续的同步代码。
-
-
特殊情况:
- 如果需要在
Add()时减少计数器(例如,某个任务被取消,不再需要等待),可以传入负数作为Add()的参数。不过,这通常不是一个常见的用法,大多数情况下只需在启动 Goroutine 前Add(),在任务完成后Done()。
- 如果需要在
总结起来,sync.WaitGroup 的使用流程如下:
- 创建
sync.WaitGroup实例。 - 在启动每个 Goroutine 前,调用
wg.Add(1)。 - 在每个 Goroutine 内部,执行任务代码,完成后调用
wg.Done()。 - 在所有 Goroutine 启动后,调用
wg.Wait(),等待所有 Goroutine 完成。 wg.Wait()返回后,继续执行后续同步代码。
Do not communicate by sharing memory; instead, share memory by communicating.

浙公网安备 33010602011771号