sync.WaitGroup用于等待一组goroutine完成,通过Add增加计数、Done减少计数、Wait阻塞至计数归零,适用于批量任务同步,如并发请求处理。

在Go语言中,sync.WaitGroup 是一种常用的同步机制,用于等待一组并发的goroutine执行完成。它特别适合在主协程中启动多个子协程并等待它们全部结束的场景,比如批量任务处理、并发请求等。
WaitGroup 通过计数器控制等待逻辑:调用 Add(n) 增加等待数量,每个goroutine执行完后调用 Done() 减一,主协程通过 Wait() 阻塞直到计数器归零。
典型使用结构如下:
var wg sync.WaitGroup
for i := 0; i < 5; i++ {
wg.Add(1)
go func(id int) {
defer wg.Done()
// 模拟任务
fmt.Printf("Goroutine %d 正在执行\n", id)
}(i)
}
wg.Wait() // 等待所有goroutine完成
fmt.Println("全部完成")
关键点:
立即学习“go语言免费学习笔记(深入)”;
使用 WaitGroup 时容易出错的地方包括:
正确做法是:在启动 goroutine 前就确定任务数量,并提前 Add。
假设我们要并发获取多个API接口数据:
urls := []string{"http://a.com", "http://b.com", "http://c.com"}
results := make([]string, len(urls))
var wg sync.WaitGroup
for i, url := range urls {
wg.Add(1)
go func(i int, u string) {
defer wg.Done()
resp, err := http.Get(u)
if err != nil {
results[i] = "error"
return
}
results[i] = resp.Status
}(i, url)
}
wg.Wait()
fmt.Println("结果:", results)
这里通过 WaitGroup 确保所有HTTP请求完成后再输出结果,避免了主协程提前退出的问题。
WaitGroup 适用于只需要“等待完成”而不需要返回值的场景。如果需要收集每个goroutine的结果,结合 channel 使用更合适:
WaitGroup 设计简洁,开销小,是Go并发编程中最基础也最实用的同步工具之一。
以上就是Golang如何使用sync.WaitGroup等待goroutine完成_Golang WaitGroup使用实践的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号