package main
import (
"fmt"
"sync"
)
// 模拟任务函数
func task(wg *sync.WaitGroup, id int) {
defer wg.Done()
fmt.Printf("Task %d is running\n", id)
}
func main() {
var wg sync.WaitGroup
numTasks := 3
// 设置WaitGroup的计数器,其Add方法用于设置等待的任务数量
wg.Add(numTasks)
for i := 1; i <= numTasks; i++ {
// 启动一个新的goroutine执行任务
go task(&wg, i)
}
// 等待所有任务完成,Wait方法会阻塞当前goroutine,直到WaitGroup的计数器归零
wg.Wait()
fmt.Println("All tasks are completed")
}
WaitGroup主要方法在代码中的作用:
- Add方法:在
main
函数中,wg.Add(numTasks)
用于设置 WaitGroup
的计数器的值为任务的数量。这个计数器表示需要等待完成的任务数。如果不调用 Add
方法或者调用的参数不正确,Wait
方法的行为将不可预测。
- Done方法:在
task
函数中,defer wg.Done()
用于将 WaitGroup
的计数器减1。通常在任务完成时调用此方法,告知 WaitGroup
一个任务已经完成。如果忘记调用 Done
方法,Wait
方法可能会永远阻塞。
- Wait方法:在
main
函数中,wg.Wait()
会阻塞当前的 goroutine
(即 main
函数所在的 goroutine
),直到 WaitGroup
的计数器归零,也就是所有任务都调用了 Done
方法。这样可以确保在所有任务完成后,main
函数才继续执行后续代码。