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

更新于:2021年11月1日

浏览量:139

启动您的职业生涯

完成课程获得认证

开始
广告