package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
// 执行任务A
wg.Add(1)
go func() {
defer wg.Done()
fmt.Println("执行任务A")
}()
// 等待任务A完成
wg.Wait()
// 并发执行任务B和C
wg.Add(2)
go func() {
defer wg.Done()
fmt.Println("执行任务B")
}()
go func() {
defer wg.Done()
fmt.Println("执行任务C")
}()
// 等待任务B和C完成
wg.Wait()
// 执行任务D
fmt.Println("执行任务D")
}
WaitGroup优势
- 简单易用:通过
Add
、Done
和Wait
方法,可以很直观地实现任务的同步等待,对于这种简单的任务编排场景,代码逻辑清晰。
- 轻量级:在Go语言的并发模型中,WaitGroup相对轻量级,开销较小。
WaitGroup劣势
- 功能局限性:只能用于简单的任务等待场景,如果需要更复杂的同步逻辑,如条件变量(
Cond
)、读写锁(RWMutex
)等实现的功能,WaitGroup无法满足。
- 缺乏灵活性:不适合处理动态变化的等待条件,例如需要在等待过程中动态增加等待的任务数量,WaitGroup使用起来会比较困难。