WaitGroup用于等待一组goroutine完成,通过Add、Done、Wait方法实现同步。典型用法是在主协程中Add增加计数,每个子协程完成后调用Done,最后主协程Wait阻塞直至所有任务结束。常见于并发请求或批量处理场景,需注意Add在goroutine外调用、避免复制WaitGroup、配合defer确保Done执行。可与Context结合实现超时控制,是Go并发编程中可靠且高效的同步工具。

在Go语言中,WaitGroup 是
sync
WaitGroup 提供三个核心方法:
典型结构如下:
var wg sync.WaitGroup
for i := 0; i < 5; i++ {
wg.Add(1)
go func(id int) {
defer wg.Done()
// 执行任务
fmt.Printf("任务 %d 完成\n", id)
}(i)
}
wg.Wait() // 等待所有任务完成
fmt.Println("所有子任务已完成")
实际开发中,常结合 for 循环启动多个goroutine,并确保每个都正确调用 Done()。推荐使用 defer wg.Done() 防止因 panic 或提前返回导致计数器不一致。
立即学习“go语言免费学习笔记(深入)”;
示例:并发抓取多个URL
package main
import (
"fmt"
"net/http"
"sync"
)
func fetch(url string, wg *sync.WaitGroup) {
defer wg.Done()
resp, err := http.Get(url)
if err != nil {
fmt.Printf("请求失败 %s: %v\n", url, err)
return
}
defer resp.Body.Close()
fmt.Printf("成功获取 %s,状态码: %d\n", url, resp.StatusCode)
}
func main() {
urls := []string{
"https://httpbin.org/get",
"https://httpbin.org/delay/2",
"https://httpbin.org/status/200",
}
var wg sync.WaitGroup
for _, url := range urls {
wg.Add(1)
go fetch(url, &wg)
}
wg.Wait()
fmt.Println("所有HTTP请求完成")
}
错误示例(避免):
go func() {
wg.Add(1) // 错误:Add在goroutine内
defer wg.Done()
}()
在更复杂的场景中,可将 WaitGroup 与 context.Context 结合,实现超时控制或取消机制。WaitGroup负责等待完成,Context负责中断信号。
例如,设置整体超时:
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() // 启动任务... wg.Wait() // 仍需等待,但受上下文约束
基本上就这些。WaitGroup简单高效,是Go中控制并发任务生命周期的常用工具。只要注意Add时机和资源安全,就能可靠使用。
以上就是Golang使用WaitGroup控制子任务完成的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号