新闻中心

Golang如何使用WaitGroup等待goroutine完成

2025-11-01
浏览次数:
返回列表
WaitGroup用于等待多个goroutine完成,通过Add增加计数、Done减少计数、Wait阻塞直至计数为零。

golang如何使用waitgroup等待goroutine完成

在Go语言中,WaitGroupsync 包提供的一个同步原语,用于等待一组并发的 goroutine 执行完成。它特别适合在主协程需要等待多个子协程结束时使用,而不需要关闭通道或处理复杂的信号机制。

基本用法和核心方法

WaitGroup 有三个主要方法:

  • Add(delta int):增加计数器,通常传入要启动的 goroutine 数量。
  • Done():在每个 goroutine 结束时调用,相当于计数器减1。
  • Wait():阻塞当前协程,直到计数器归零。

典型结构是:主协程调用 Add(n) 设置任务数量,每个子协程执行完后调用 Done(),主协程通过 Wait() 阻塞等待全部完成。

简单示例:等待多个goroutine完成

package main

import (
    "fmt"
    "sync"
    "time"
)

func worker(id int, wg *sync.WaitGroup) {
    defer wg.Done() // 任务完成,计数器减1
    fmt.Printf("Worker %d starting\n", id)
    time.Sleep(time.Second) // 模拟工作
    fmt.Printf("Worker %d done\n", id)
}

func main() {
    var wg sync.WaitGroup

    for i := 1; i <= 3; i++ {
        wg.Add(1)           // 增加计数
        go worker(i, &wg)   // 启动goroutine
    }

    wg.Wait() // 等待所有worker完成
    fmt.Println("All workers finished")
}

输出会显示三个 worker 依次开始和结束,最后打印“All workers finished”。

NameGPT NameGPT

免费的名称生成器,AI驱动在线生成企业名称及Logo

NameGPT 119 查看详情 NameGPT

注意事项和常见错误

使用 WaitGroup 时需注意以下几点:

  • 避免Add负值:调用 Add(-n) 会导致 panic,除非你明确知道计数器足够大。
  • 确保Done被调用:每个 Add(1) 必须对应一次 Done(),否则程序会一直阻塞。
  • 传递指针:应将 WaitGroup 的指针传给 goroutine,避免值拷贝导致状态不一致。
  • Add应在Wait前调用:最好在 go 语句前调用 Add,防止竞争条件。

适用场景

WaitGroup 适用于以下情况:

  • 批量启动多个 goroutine 并等待它们全部完成(如并行请求、数据抓取)。
  • 无需从 goroutine 获取返回值,只关心执行完成。
  • 作为轻量级同步工具,比通道更简洁。

基本上就这些。只要记住 Add、Done、Wait 的配合使用,就能安全地控制并发流程。

以上就是Golang如何使用WaitGroup等待goroutine完成的详细内容,更多请关注其它相关文章!


# 相关文章  # 全国网站建设模板套餐  # 企业短视频营销推广方式  # seo怎样建立网站排名  # 商务网站建设原创  # 上海指定关键词排名  # 微信微博营销推广  # 历城区专业网站推广  # 山西各大营销推广企业  # 新品seo标题优化技巧论文  # 番禺区网站整站优化  # 中文网  # go  # 而不  # 适用于  # 就能  # 结束时  # 自定义  # 如何使用  # 死锁  # 多个  # ai  # go语言  # golang 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 抖音网页版平台入口 抖音网页版官网在线访问教程  在Go语言中利用后缀数组处理多字符串:实现高效文本匹配与自动补全  J*a TimerTask中HashMap意外清空的深层原因与解决方案  QQ邮箱稳定登录入口_QQ邮箱官方网站网页版使用  今日头条怎么同步内容到抖音_今日头条内容同步到抖音教程  邮政快递包裹最新位置 邮政快递实时追踪入口  苹果手机如何防止被恶意App追踪  铁路12306改签能改到更早的车次吗_铁路12306改签提前车次规则  百度网盘网页版入口 百度网盘网页版官方登录网址  msn官网入口地址手机版 msn官方网站手机最新链接  Python自定义类排序:解决lambda键值访问TypeError的实践指南  痛风发作了怎么办? 快速止痛和后期饮食调理  淘宝网网页版登录入口 淘宝官方网页版快捷登录  mcjs网页版流畅运行 mcjs低配电脑畅玩入口  在Runstone环境中高效处理TasteDive API的JSON数据  响应式图片在网页设计中的正确实现方法  千牛数据看板网页版_千牛数据看板网页版访问方法  抖音创作助手登录入口_抖音创作辅助工具官网直达  菜鸟取件码是什么怎么查 最全查询渠道汇总  汽水音乐在线版入口_汽水音乐网页播放手册  提升Kafka消费者健壮性:会话超时处理与消息处理语义  Spring Boot内嵌服务器与J*a EE全栈特性:选择与部署策略  Mac怎么锁定备忘录_Mac备忘录加密设置教程  必由学官方平台入口 必由学在线课堂登录地址  excel怎么制作工资条 excel快速生成工资条的方法  j*a toString()的覆盖  Win10如何恢复误删的快捷方式_Win10重建常用软件快捷方式  Bing引擎入口最新2025 Bing搜索免费官方登录  内存检查:在VS Code中调试C++时的内存视图  消息称三星明年 2 月正式发布 HBM4,与 SK 海力士同台竞技  React列表渲染与独立状态管理:避免全局状态影响局部更新  SteamMachine定价或为699美元 大家想入手吗?  Win10系统怎么查看已安装更新_Win10卸载有问题的更新补丁  QQ邮箱官网登录入口 QQ邮箱网页版邮箱快速登录  DLsite中文平台入口 DLsite官网内容在线查看  微博网页版直接访问 微博网页版账号管理快速入口  Win10如何清理注册表垃圾 Win10注册表维护与优化指南【慎用】  包子漫画官方网站在线链接-包子漫画在线阅读平台主页地址  使用 Pandas 高效处理 .dat 文件:数据清洗与数值计算实战  如何在离线环境中使用Composer_Composer离线安装依赖包的技巧与策略  C++如何实现单例模式_C++设计模式之线程安全的单例写法  谷歌邮箱注册显示错误Gmail服务器异常与延迟处理  Win11文件资源管理器卡顿怎么修 Win11重置资源管理器进程优化响应速度【修复方法】  windows10怎么关闭系统提示音_windows10彻底静音设置方法  CSS实现侧边栏导航项全宽圆角悬停背景效果  sublime侧边栏怎么增强功能_SideBarEnhancements for sublime安装与配置  解决 Vaadin 8 中大文件音频播放与定位时出现的 IOException  c++中的const_cast和reinterpret_cast怎么用_c++四种类型转换  Composer的 "check-platform-reqs" 命令有什么用_在部署前检查生产环境是否满足Composer依赖需求  如何将HTML表格多行数据保存到Google Sheet 

搜索