当 Goroutine 需要等待:Go 中 sync.WaitGroup 的优雅使用

简介: 当 Goroutine 需要等待:Go 中 sync.WaitGroup 的优雅使用

当 Goroutine 需要等待:Go 中 sync.WaitGroup 的优雅使用

在 Go 并发编程中,我们经常遇到一个经典场景:启动多个 goroutine 执行任务,主程序需要等待所有任务完成后再继续。这时,sync.WaitGroup 就成为了我们的得力助手。

核心原理

WaitGroup 本质上是一个计数器。通过 Add() 增加计数,Done() 减少计数,Wait() 阻塞直到计数归零。这种简洁的 API 设计让并发等待变得异常清晰。

典型使用模式

var wg sync.WaitGroup

for _, task := range tasks {
   
    wg.Add(1)
    go func(t Task) {
   
        defer wg.Done()
        process(t)
    }(task)
}

wg.Wait()
fmt.Println("所有任务完成")

实用场景

  • 并行处理批量数据(如图片处理、文件上传)
  • 微服务中并发调用多个下游接口
  • 测试用例中的并发验证
  • 服务启动时的初始化协程

关键注意事项

  1. Add 要在 goroutine 外调用:避免竞态条件
  2. 使用 defer wg.Done():确保即使 panic 也能递减计数
  3. 不要复制 WaitGroup:传递时使用指针
  4. 计数归零后 WaitGroup 可复用:通过 Add 重新设置计数

进阶技巧

结合 context 实现带超时的等待:

ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

done := make(chan struct{
   })
go func() {
   
    wg.Wait()
    close(done)
}()

select {
   
case <-done:
    // 正常完成
case <-ctx.Done():
    // 超时处理
}

WaitGroup 体现了 Go 的设计哲学:用简单的抽象解决复杂问题。掌握它,你就能优雅地驾驭并发等待场景,写出更健壮的 Go 程序。

记住:在并发世界中,有时等待比执行更需要智慧。

相关文章
Go语言同步原语与数据竞争:WaitGroup
本文介绍了 Go 语言中 `sync.WaitGroup` 的使用方法和注意事项。作为同步原语,它通过计数器机制帮助等待多个 goroutine 完成任务。核心方法包括 `Add()`(设置等待数量)、`Done()`(减少计数)和 `Wait()`(阻塞直到计数归零)。文章详细讲解了其基本原理、典型用法(如等待 10 个 goroutine 执行完毕),并提供了代码示例。同时指出常见错误,例如 `Add()` 必须在 goroutine 启动前调用,以及 WaitGroup 不可重复使用。最后总结了适用场景和使用要点,强调避免竞态条件与变量捕获陷阱。
|
6月前
|
安全 网络协议 数据安全/隐私保护
docker-compose 部署clickhouse-server:24.6
本文介绍了如何使用 Docker Compose 快速部署 ClickHouse Server 24.6 单节点服务,含端口映射(8123/9000)、数据日志持久化、密码安全配置及自定义 config.xml 示例,并提供启动验证命令与生产安全提示。
877 0
|
6月前
|
存储 Cloud Native Go
Go Context:高效并发控制的核心利器
Go Context:高效并发控制的核心利器
292 138
|
6月前
|
安全 Go API
Go并发实战:用goroutine和channel实现高效网络请求
Go并发实战:用goroutine和channel实现高效网络请求
316 140
|
6月前
|
Go 开发者 微服务
Go错误处理:从`if err != nil`到清晰代码
Go错误处理:从`if err != nil`到清晰代码
310 137
|
6月前
|
存储 Go 数据库
掌控并发:Go Context 的实战精要
掌控并发:Go Context 的实战精要
301 139
|
7月前
|
人工智能 数据可视化 API
看完《疯狂动物城》心痒痒?试试ComfyUI,让朱迪和尼克走进你的画布
看完《疯狂动物城》意犹未尽?用ComfyUI+Flux文生图模型,让朱迪和尼克跃然纸上!通过节点式工作流精准控制生成细节,还原动画级质感。毛发、表情、服饰皆栩栩如生,支持风格定制与角色一致性强的图像创作。无需高配硬件,Lab4AI平台一键部署,轻松实现你的创意构想。Anyone can create anything!
1158 1
看完《疯狂动物城》心痒痒?试试ComfyUI,让朱迪和尼克走进你的画布
|
安全 程序员 数据安全/隐私保护
终于有篇文章把后管权限系统设计讲清楚了
【2月更文挑战第1天】在常用的后台管理系统中,通常都会有权限系统设计,以用于给对应人员分配不同权限,控制其对后管系统中的某些菜单、按钮以及列表数据的可见性。
1529 2
终于有篇文章把后管权限系统设计讲清楚了