Go语言中的WaitGroup是什么?
在Go语言中,可能存在不同**goroutine**的执行导致意外行为的情况。在这种情况下,我们需要确保某些**goroutine**以预定义的方式工作,并且程序等待从主函数启动的所有**goroutine**完成。为此,我们使用**WaitGroup**。
**WaitGroup**允许我们解决上述问题,因为它会在**WaitGroup**中的任何**goroutine**成功执行之前阻塞代码。
**WaitGroup**有三个导出的方法供我们使用:这些是:
**Add(int)** – 增加计数器。
**Wait()** – 在内部计数器变为0之前阻塞执行。
**Done()** – 将计数器减少1。
示例1
让我们考虑一个不使用**WaitGroup**的**goroutine**示例。
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**中调用的函数的输出。这是因为**main**函数在执行该**goroutine**之前就终止了。
为了解决这个问题,我们使用**WaitGroup**,它用于阻塞程序,直到**WaitGroup**中的任何**goroutine**成功执行。
示例2
现在,让我们借助**WaitGroup**来解决上面的例子。请考虑以下代码。
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:匿名函数中的WaitGroup
如果我们有一个在单独**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
广告
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP