WaitGroup 是 Go 語(yǔ)言的一個(gè)并發(fā)控制機(jī)制,它可以用于等待一組 goroutine 的結(jié)束。WaitGroup 提供了三個(gè)方法:Add、Done 和 Wait。
Add 方法:用于設(shè)置 WaitGroup 中等待的 goroutine 的數(shù)量。Add 方法的參數(shù)是一個(gè)整數(shù),表示需要等待的 goroutine 的數(shù)量。通常在啟動(dòng)每個(gè) goroutine 之前都會(huì)調(diào)用 Add 方法來(lái)增加要等待的 goroutine 的數(shù)量。
Done 方法:用于通知 WaitGroup 一個(gè) goroutine 的結(jié)束。在 goroutine 的最后調(diào)用 Done 方法來(lái)減少 WaitGroup 中等待的 goroutine 的數(shù)量。
Wait 方法:用于阻塞當(dāng)前 goroutine,直到 WaitGroup 中等待的 goroutine 的數(shù)量變?yōu)?0。一般在主 goroutine 里調(diào)用 Wait 方法,等待所有子 goroutine 結(jié)束后再繼續(xù)執(zhí)行。
下面是一個(gè)使用 WaitGroup 的示例代碼:
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
for i := 0; i < 5; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
fmt.Printf("goroutine %d\n", i)
}(i)
}
wg.Wait()
fmt.Println("All goroutines finished")
}
在上面的例子中,首先創(chuàng)建了一個(gè) WaitGroup 對(duì)象 wg。然后使用一個(gè) for 循環(huán)啟動(dòng)了 5 個(gè) goroutine,并在每個(gè) goroutine 中調(diào)用了 wg.Add(1) 來(lái)增加 WaitGroup 中等待的 goroutine 的數(shù)量。在每個(gè) goroutine 的最后調(diào)用了 wg.Done() 來(lái)通知 WaitGroup 一個(gè) goroutine 的結(jié)束。最后在主 goroutine 中調(diào)用了 wg.Wait() 來(lái)等待所有的子 goroutine 結(jié)束。
上面的代碼運(yùn)行時(shí),可能會(huì)輸出類似如下的結(jié)果:
goroutine 4
goroutine 0
goroutine 3
goroutine 2
goroutine 1
All goroutines finished
可以看到,不同的 goroutine 的輸出順序是隨機(jī)的,這是因?yàn)樗鼈兪遣l(fā)執(zhí)行的。
總結(jié):WaitGroup 是 Go 語(yǔ)言中一個(gè)用于等待一組 goroutine 結(jié)束的機(jī)制。通過(guò)調(diào)用 Add、Done 和 Wait 方法,可以實(shí)現(xiàn)對(duì)一組 goroutine 的并發(fā)控制。