package main
import (
"fmt"
"sync"
)
// 模拟异步函数
func asyncFunction(i int, wg *sync.WaitGroup) int {
defer wg.Done()
fmt.Printf("异步函数 %d 开始执行\n", i)
// 模拟一些工作
result := i * 2
fmt.Printf("异步函数 %d 执行结束,结果为 %d\n", i, result)
return result
}
func main() {
var wg sync.WaitGroup
results := make([]int, 5)
// 设置WaitGroup计数器为5,因为有5个异步函数
wg.Add(5)
for i := 0; i < 5; i++ {
go func(index int) {
results[index] = asyncFunction(index, &wg)
}(i)
}
// 等待所有异步函数完成
wg.Wait()
// 汇总输出结果
fmt.Println("所有异步函数执行完毕,汇总结果:")
for _, result := range results {
fmt.Printf("%d ", result)
}
fmt.Println()
}
使用WaitGroup
实现并发控制说明:
- 初始化计数器:通过
wg.Add(n)
方法设置WaitGroup
的计数器为n
,这里n
是需要并发执行的函数数量,即5个异步函数,所以wg.Add(5)
。
- 标记任务完成:在每个异步函数内部,使用
defer wg.Done()
,这样当函数执行结束时,会将WaitGroup
的计数器减1。
- 等待所有任务完成:在主函数中,使用
wg.Wait()
,这个方法会阻塞当前goroutine,直到WaitGroup
的计数器变为0,即所有异步函数都执行完毕,此时就可以进行结果汇总等后续操作。