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
广告