package main
import (
"fmt"
"sync"
"time"
)
func main() {
var wg sync.WaitGroup
numGoroutines := 5
// Add 方法设置 WaitGroup 要等待的 goroutine 数量
wg.Add(numGoroutines)
for i := 0; i < numGoroutines; i++ {
go func(id int) {
// 模拟网络请求操作
defer wg.Done() // Done 方法表示一个 goroutine 已经完成任务
fmt.Printf("Goroutine %d is working\n", id)
time.Sleep(time.Second)
}(i)
}
// Wait 方法阻塞当前 goroutine,直到所有 goroutine 都调用了 Done 方法
wg.Wait()
fmt.Println("All goroutines have finished")
}
sync.WaitGroup 关键方法作用
- Add(delta int):设置 WaitGroup 要等待的 goroutine 数量。
delta
为正数表示新增要等待的 goroutine 数量,负数表示减少等待的 goroutine 数量(但一般不建议使用负数,因为容易造成逻辑混乱)。
- Done():表示一个 goroutine 已经完成任务,等价于
wg.Add(-1)
,一般在 defer 中调用,确保即使函数提前返回也能正确标记任务完成。
- Wait():阻塞当前 goroutine,直到所有通过
Add
方法设置的要等待的 goroutine 都调用了 Done
方法,即等待计数归零。