📜  在 Golang 中使用 WaitGroup(1)

📅  最后修改于: 2023-12-03 14:50:55.712000             🧑  作者: Mango

在 Golang 中使用 WaitGroup

在 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 不是并发安全的,因此不能在多个协程中同时调用 AddDone 方法。
  • WaitGroup 对象的创建和传递应该在调用协程内完成,而不是在被调用函数中完成。

参考文献: