Golang 什么是WaitGroups

Golang 什么是WaitGroups

在Golang中可能会有这样的情况:不同的 goroutine 的执行可能会导致意外的行为。在这种情况下,我们要确保某些 goroutines 以预定的方式工作,并且程序要等待所有从主函数启动的 goroutines 等待。为了做到这一点,我们使用了 WaitGroups。

WaitGroups 允许我们解决上面提到的问题,因为它们会阻止代码,直到 WaitGroup 内的任何 goroutines 被成功执行。

一个 WaitGroup 有三个导出的方法,我们可以使用。这些方法是 –

  • Add(int) – 增加计数器。

  • Wait() – 阻止执行,直到内部计数器变为0。

  • Done() – 将计数器减少1。

例子1

让我们考虑一个例子,我们将使用一个没有任何 WaitGroupsgouroutine

package main

import (
   "fmt"
)

func sumOfNumbers() {
   fmt.Println("Adding the numbers...")
}

func main() {
   fmt.Println("First")

   go sumOfNumbers()

   fmt.Println("Second")
}
Go

输出

如果我们使用命令 go run main.go 来运行上述代码,那么我们将得到以下输出-

First
Second
Go

请注意,我们无法得到在 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")
}
Go

输出

如果我们运行上述代码,它将产生以下输出 —

First
Adding the numbers...
Second
Go

例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

输出

如果我们使用命令 go run main.go 来运行上述代码,那么我们将得到以下输出-

First
Adding the numbers...
Second
Go

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册