📅  最后修改于: 2023-12-03 14:50:55.712000             🧑  作者: Mango
在 Golang 中,WaitGroup
是一种非常常用的同步工具,可以用于协调多个并发 goroutine 同时执行或等待一组协程执行任务完成后再进行下一步操作。 WaitGroup
通过计数器来实现同步,它的用法通常如下:
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
// 做一些事情
}()
wg.Wait()
上述代码中,我们首先创建了一个 WaitGroup
对象 wg
,然后通过 Add
方法将计数器加1,表示当前有一个 goroutine 需要等待。接着,我们开启了一个新的 goroutine,执行其中的任务,同时在 goroutine 结束时使用 wg.Done()
方法将计数器减1。最后,通过调用 wg.Wait()
方法来等待所有任务执行结束。
对于比较复杂的业务场景,可以在一个 goroutine 中启动多个 goroutine,使用 WaitGroup
来确保它们都执行完成后再进行下一步操作。
var wg sync.WaitGroup
for _, task := range tasks {
wg.Add(1)
go func(task Task) {
defer wg.Done()
// 执行 task
}(task)
}
wg.Wait()
// 所有任务执行完成,进行下一步操作
在使用 WaitGroup
的时候,需要注意以下几点:
Add
的调用次数必须与 Done
的调用次数相等,否则会导致 Wait
方法一直阻塞。WaitGroup
不是并发安全的,因此不能在多个协程中同时调用 Add
和 Done
方法。WaitGroup
对象的创建和传递应该在调用协程内完成,而不是在被调用函数中完成。 参考文献: