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

啟動您的職業生涯

完成課程獲得認證

開始
廣告
© . All rights reserved.