Golang 什么是WaitGroups
在Golang中可能会有这样的情况:不同的 goroutine 的执行可能会导致意外的行为。在这种情况下,我们要确保某些 goroutines 以预定的方式工作,并且程序要等待所有从主函数启动的 goroutines 等待。为了做到这一点,我们使用了 WaitGroups。
WaitGroups 允许我们解决上面提到的问题,因为它们会阻止代码,直到 WaitGroup 内的任何 goroutines 被成功执行。
一个 WaitGroup 有三个导出的方法,我们可以使用。这些方法是 –
- Add(int) – 增加计数器。
-
Wait() – 阻止执行,直到内部计数器变为0。
-
Done() – 将计数器减少1。
例子1
让我们考虑一个例子,我们将使用一个没有任何 WaitGroups 的 gouroutine 。
package main
import (
"fmt"
)
func sumOfNumbers() {
fmt.Println("Adding the numbers...")
}
func main() {
fmt.Println("First")
go sumOfNumbers()
fmt.Println("Second")
}
输出
如果我们使用命令 go run main.go 来运行上述代码,那么我们将得到以下输出-
First
Second
请注意,我们无法得到在 goroutine 中调用的函数的输出 。 这是因为 主 函数在执行该 goroutine 之前就被终止了 。
为了解决这个问题,我们使用了 WaitGroups ,它被用来阻止程序,直到 WaitGroup 中的任何 goroutine 成功执行。
例2
现在,让我们在 WaitGroups 的帮助下解决上述例子 。 请看下面的代码。
package main
import (
"fmt"
"sync"
)
func sumOfNumbers(wg *sync.WaitGroup) {
fmt.Println("Adding the numbers...")
wg.Done()
}
func main() {
fmt.Println("First")
var wg sync.WaitGroup
wg.Add(1)
go sumOfNumbers(&wg)
wg.Wait()
fmt.Println("Second")
}
输出
如果我们运行上述代码,它将产生以下输出 —
First
Adding the numbers...
Second
例3:匿名函数中的WaitGroups
如果我们有一个匿名函数在一个独立的 goroutine 上运行,我们也可以实现与上面一样的效果 。
请看下面的代码。
package main
import (
"fmt"
"sync"
)
func main() {
fmt.Println("First")
var wg sync.WaitGroup
wg.Add(1)
go func() {
fmt.Println("Adding the numbers...")
wg.Done()
}()
wg.Wait()
fmt.Println("Second")
}
输出
如果我们使用命令 go run main.go 来运行上述代码,那么我们将得到以下输出-
First
Adding the numbers...
Second
极客教程