package main
import (
"fmt"
"sync"
"time"
)
func main() {
var wg sync.WaitGroup
wg.Add(10)
for i := 0; i < 10; i++ {
go func(id int) {
defer wg.Done()
fmt.Printf("Task %d started\n", id)
time.Sleep(1 * time.Second)
fmt.Printf("Task %d completed\n", id)
}(i)
}
wg.Wait()
fmt.Println("All tasks completed")
}
WaitGroup关键方法在场景中的作用
- wg.Add(n):用于向WaitGroup添加需要等待的任务数量,这里
wg.Add(10)
表示有10个任务需要等待完成。
- wg.Done():每个任务完成时调用此方法,通知WaitGroup该任务已完成。在上面代码中,
defer wg.Done()
确保即使任务内部发生错误或提前返回,也能正确通知WaitGroup任务已结束。
- wg.Wait():调用此方法会阻塞当前goroutine,直到所有添加到WaitGroup的任务都调用了
wg.Done()
,即所有任务都完成,程序才会继续执行wg.Wait()
之后的代码。