登录
首页 >  Golang >  Go教程

GolangWaitGroup等待goroutine完成方法

时间:2025-11-17 18:12:36 317浏览 收藏

**Golang WaitGroup:高效管理并发 Goroutine 的利器** 在 Golang 并发编程中,`sync.WaitGroup` 扮演着至关重要的角色,它能够优雅地等待一组 Goroutine 完成任务,实现并发任务的同步。本文将深入探讨 `WaitGroup` 的原理、用法和常见错误,助您掌握如何利用它来高效处理批量任务,例如并发请求处理。通过 `Add` 增加计数器,`Done` 减少计数器,以及 `Wait` 阻塞等待计数器归零,`WaitGroup` 确保所有 Goroutine 执行完毕后再继续执行主协程。了解 `WaitGroup` 与 Channel 的区别,并结合实际应用场景,选择最合适的并发同步方案,提升 Go 程序的性能和可靠性。

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

Golang如何使用sync.WaitGroup等待goroutine完成_Golang WaitGroup使用实践

在Go语言中,sync.WaitGroup 是一种常用的同步机制,用于等待一组并发的goroutine执行完成。它特别适合在主协程中启动多个子协程并等待它们全部结束的场景,比如批量任务处理、并发请求等。

WaitGroup基本用法

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("全部完成")

关键点:

  • Add 必须在 go语句之前 调用,否则可能产生竞态条件
  • Done 通常用 defer 确保一定会执行
  • Wait 放在主协程最后调用,阻塞直到所有任务结束

常见错误与注意事项

使用 WaitGroup 时容易出错的地方包括:

  • Add 调用时机错误:如果在 goroutine 内部才 Add,可能导致主协程 Wait 提前返回
  • 重复 Done:一个 goroutine 多次 Done 会导致计数器负数,panic
  • 忘记 Done:某个 goroutine 没调用 Done,导致主协程永远阻塞

正确做法是:在启动 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请求完成后再输出结果,避免了主协程提前退出的问题。

与channel的对比选择

WaitGroup 适用于只需要“等待完成”而不需要返回值的场景。如果需要收集每个goroutine的结果,结合 channel 使用更合适:

  • 只关心完成:用 WaitGroup
  • 需要返回数据:WaitGroup + channel 或直接用 channel 控制
  • 有超时需求:建议用 context 配合 channel 实现

WaitGroup 设计简洁,开销小,是Go并发编程中最基础也最实用的同步工具之一。

今天关于《GolangWaitGroup等待goroutine完成方法》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>