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