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