📌  相关文章
📜  golang waitgroup - Go 编程语言 - Go 编程语言(1)

📅  最后修改于: 2023-12-03 15:31:01.140000             🧑  作者: Mango

Golang WaitGroup

WaitGroup 是Golang并发编程中一个重要的开发工具,它可以让你在一个goroutine中启动多个goroutine,等待它们完成后再进行下一步操作。

WaitGroup的用途

在Golang中,一个goroutine通常是一个轻量级的线程,它可以被快速的创建和销毁。WaitGroup 可以帮助我们协调多个goroutine,让它们在不同的时间内同时执行。

我们常常需要在程序中启动数个goroutine并等待它们全部完成后再执行下一步操作,这时候我们可以使用 WaitGroup 来实现。

WaitGroup的基本使用方法

在使用 WaitGroup 时,我们需要初始化一个 WaitGroup ,调用 Add() 方法来设定计数器的初始值,每个goroutine完成时需要调用 Done() 方法以通知计数器减一,而主函数可以调用 Wait() 方法来暂停等待所有的 goroutine 完成。

var wg sync.WaitGroup
for i := 0; i < 10; i++ {
    wg.Add(1)
    go func(i int) {
        defer wg.Done()
        // do something...
    }(i)
}
wg.Wait()

在上述例子中,我们启动了10个goroutine,每次启动的时候都调用 Add(1) ,表示计数器的值加一。每个goroutine完成后都会调用 Done() 方法,表示计数器的值减一。主函数中的 Wait() 方法会阻止主函数的退出,直到计数器的值归零。

WaitGroup的其他方法

WaitGroup.Add(delta int)

用于增加计数器的值,delta表示增加的值,delta可以为负数表示减少计数器的值。

var wg sync.WaitGroup
wg.Add(2)
go func() {
    defer wg.Done()
    // do something...
}()
go func() {
    defer wg.Done()
    // do something...
}()
wg.Wait()

在上述例子中,我们调用了两次 Add(),表示计数器的初始值为2。两个goroutine完成后会调用 Done() 方法,计数器减少2个,主函数才会退出执行。

WaitGroup.Done()

用于减少计数器的值,每次减少1。主要在goroutine完成操作后调用。如果计数器减少到0,所有通过 Wait() 方法阻塞的goroutine都会解除阻塞继续执行。

WaitGroup.Wait()

主要是在主函数中使用,调用 Wait() 方法会阻塞当前 goroutine 直到计数器归零,所有被 Add() 的 goroutine 完成的时候会调用 Done() 方法以减少计数器的值。

总结

WaitGroup 是一种非常简单而有效的调度机制,让多个goroutine可以同步地执行任务。通过 Add() 来设定计数器的初始值, Done() 来减少计数器的值并通知主函数,最后在主函数中调用 Wait() 方法等待所有的goroutine都完成任务。