快速导航×

Golang如何使用WaitGroup等待多个Goroutine完成_Golang WaitGroup同步模式解析2025-12-16 11:38:03
WaitGroup用于同步等待多个Goroutine完成,通过Add增加计数、Done减少计数、Wait阻塞直至计数为零,适用于并发任务控制。

golang如何使用waitgroup等待多个goroutine完成_golang waitgroup同步模式解析

在Go语言中,WaitGroup 是一种常用的同步机制,用于等待一组并发执行的 Goroutine 完成任务。它属于 sync 包,适用于主线程需要等待多个子任务结束后再继续执行的场景。这种模式常用于批量处理、并发请求、数据采集等。

WaitGroup 的基本结构和方法

sync.WaitGroup 内部维护一个计数器,用来记录正在运行的 Goroutine 数量。主要提供三个方法:

  • Add(delta int):增加或减少计数器值。通常传入正整数来设置需要等待的 Goroutine 数量。
  • Done():将计数器减1,通常在 Goroutine 结束时调用,等价于 Add(-1)
  • Wait():阻塞当前协程,直到计数器归零,表示所有任务完成。

使用 WaitGroup 的典型模式

以下是一个使用 WaitGroup 等待多个 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)
    }

    wg.Wait() // 阻塞,直到所有 worker 调用 Done()
    fmt.Println("All workers completed")
}

输出结果为:

Worker 1 starting
Worker 2 starting
Worker 3 starting
Worker 1 done
Worker 2 done
Worker 3 done
All workers completed

在这个例子中,主线程通过 wg.Wait() 等待所有 worker 执行完毕,确保最后的提示信息在所有任务结束后才打印。

达芬奇 达芬奇

达芬奇——你的AI创作大师

达芬奇 166 查看详情 达芬奇

使用注意事项和常见问题

使用 WaitGroup 时需注意以下几点以避免死锁或 panic:

  • 确保 Add 在 Goroutine 启动前调用:如果在 go 语句之后调用 Add,可能因竞态导致计数器未及时更新,造成漏计。
  • 每个 Add 必须有对应的 Done:Add 和 Done 的调用次数必须匹配,否则会导致 Wait 永不返回或 panic。
  • 传递指针给 Goroutine:应将 *sync.WaitGroup 的指针传入函数,避免值拷贝导致无法正确同步。
  • 避免重复调用 Wait:同一个 WaitGroup 可以复用,但必须保证计数器归零后才能再次使用,否则行为未定义。

WaitGroup 与 Channel 的对比

虽然也可以使用 channel 实现类似功能(如通过关闭 channel 广播完成信号),但 WaitGroup 更简洁直观,特别适合“只关心完成、不传递数据”的场景。而 channel 更适合需要传递状态或结果的复杂同步逻辑。

基本上就这些。WaitGroup 是 Go 中轻量且高效的同步工具,掌握它的正确用法对编写可靠的并发程序至关重要。

以上就是Golang如何使用WaitGroup等待多个Goroutine完成_Golang WaitGroup同步模式解析的详细内容,更多请关注其它相关文章!


# golang  # 花瓶营销推广方案怎么写  # 影响关键词排名因素  # 江苏快速seo公司  # 公众出行服务网站建设  # 如何在  # 在这个  # 是一种  # 是一个  # 死锁  # 布尔  # 适用于  # 如何使用  # 多个  # 达芬奇  # 同步机制  # 并发请求  # ai  # go语言  # go  # 自动网站优化公司有哪些  # seo江湖技巧  # 街道口网站推广公司服务  # 淄博网站建设包括什么  # seo公司怎么转型  # 阳泉关键词排名目的优化 


相关栏目: 【 企业资讯168 】 【 行业动态20933 】 【 网络营销52431 】 【 网络学院91036 】 【 运营推广7012 】 【 科技资讯60970


相关推荐: Safari怎么安装扩展程序 浏览器插件安装与管理方法【详解】  J*a里如何使用N*igableMap进行导航操作_可导航Map操作技巧解析  Word2013如何插入视频和音频媒体_Word2013媒体插入的多媒体支持  极兔快递快件信息查询系统 极兔快递官网运单号追踪  sublime如何只显示或隐藏特定类型文件_sublime侧边栏文件过滤  windows10怎么关闭系统提示音_windows10彻底静音设置方法  微信网页版扫码登录入口 微信网页版二维码登录入口  C++20的source_location是什么_C++在编译期获取源码位置信息用于日志和断言  qq游戏跨平台入口_qq游戏多设备同步登录  Go语言中实现优先级队列:container/heap包的正确姿势  qq邮箱发邮件给国外发不出去_QQ邮箱国际邮件发送失败原因与解决  css卡片内容溢出如何处理_使用overflow隐藏或scroll显示内容  在Go Martini框架中高效服务动态生成图像的实践指南  快手赚钱渠道_快手收益来源  邮编格式怎么匹配地址_根据邮编格式快速匹配详细地址的技巧  高德地图公交到站提醒失败如何解决 高德提醒权限设置  在J*a中如何使用Stream.map转换元素_Stream映射操作解析  HTML5原生日期选择器与jQuery UI:实现日期选择器的联动与程序化控制  c++如何使用Catch2编写单元测试_c++简洁易用的BDD风格测试框架  漫蛙漫画网页端入口 漫蛙2官方正版漫画站点  高德地图家和公司地址在哪设置 高德地图通勤路线设置方法【超详细】  探索高级语言到原生C/C++的转译:挑战与内存管理策略  J*aScript 字符串标签转换:使用正则表达式高效替换  一加手机电池耗电快怎么办_一加手机电池耗电快的解决方法  拼多多视频播放卡顿如何处理 拼多多视频播放优化技巧  CSS布局中意外空白:解决padding-top导致的顶部间距问题  J*aScript井字棋(Tic-Tac-Toe)核心交互逻辑实现教程  c++如何使用Meson构建系统_c++比CMake更快的构建工具  如何使用Node.js csv 包按条件移除含空字段的CSV记录  Android Studio计算器C键功能异常排查与修复教程  快手网页版在线登录 快手网页版官网入口快速访问  C++如何操作注册表_Windows平台下C++读写注册表的API函数详解  邮政编码查询不到怎么办_邮政编码查询不到的常见原因与对策  解决Python单元测试中Mock异常方法调用计数为零的问题  腾讯视频怎么举报不良内容_腾讯视频内容举报流程与违规信息处理方法  小红书网页版入口链接分享 小红书官网直接进  Sublime Text怎么设置垂直标尺_Sublime配置Rulers规范代码长度  J*aScript对象创建方式_J*aScript设计模式应用  服务端验证_j*ascript输入检查  age动漫网站入口 age动漫官网直接访问入口  文心一言怎样用批量生成做多版文案_文心一言用批量生成做多版文案【批量创作】  打开就能玩的植物大战僵尸 植物大战僵尸网页版传送门  css滚动动画效果怎么实现_使用Animate.css滚动触发动画类  QQ邮箱电脑版登录入口_QQ邮箱官方网站登录平台  Go语言中JSON数据解码与字段访问指南  《主播少女的秘密账号迷宫》首支宣传片  不会效仿卡普空!《铁拳》制作人澄清:不采取赛事付费|直播|  多闪网页版在线观看免费入口_多闪官网访问入口  Eclipse怎么运行工程_Eclipse工程运行配置说明  如何修改开机登录密码_Windows账户安全设置超详细教程【必学】