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.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)