sync.WaitGroup是Go中用于等待goroutine完成的轻量同步机制,核心为计数器:启动前Add(1),结束时Done(),Wait()阻塞至归零;须遵守三规则:Add在goroutine外调用、Done与Add配对、仅传指针不可复制。

Go语言中,sync.WaitGroup 是最常用、最轻量的协程同步机制之一,用于等待一组 goroutine 全部执行完毕。它的核心是计数器:每启动一个 goroutine 就 Add(1),每个 goroutine 结束时调用 Done()(等价于 Add(-1)),主线程通过 Wait() 阻塞直到计数器归零。
使用 WaitGroup 有三个必须遵守的要点:
wg.Add(n) 不能放在 goroutine 内部,否则可能漏加或竞态;Done() 必须有对应 Add(1) —— 多调或少调都会导致死锁或提前返回;&wg)给 goroutine,否则副本操作无效。以下是一个典型场景:发起 3 个 HTTP 请求,全部完成后统一处理结果:
(注意:省略错误处理以突出同步逻辑)
func main() {
var wg sync.WaitGroup
urls := []string{"https://httpbin.org/delay/1", "https://httpbin.org/delay/2", "https://httpbin.org/delay/1"}
<pre class="brush:php;toolbar:false;">results := make([]string, len(urls))
for i, url := range urls {
wg.Add(1) // ✅ 在 goroutine 外提前加 1
go func(idx int, u string) {
defer wg.Done() // ✅ 确保无论是否出错都调用
resp, _ := http.Get(u)
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
results[idx] = string(body[:min(len(body), 50)])
}(i, url)
}
wg.Wait() // ✅ 主线程阻塞等待全部完成
fmt.Println("All done:", len(results))}
稿定抠图
AI自动消除图片背景
80
查看详情
这些错误极易引发死锁或 panic,需特别留意:
go func() { ... }(i) 写成 go func() { ... }(),会导致所有 goroutine 共享同一个 i 值;解决方法:显式传参(如上例)或用局部变量绑定;Done() 或 recover 后未调用 —— 推荐用 defer wg.Done(),确保退出路径全覆盖;go worker(wg, job)(值传递),应改为 go worker(&wg, job);Add(),而应新建或确保计数器已为 0(通常建议每次用新实例)。有时不能无限等待,可用 select + time.After 实现超时控制:
done := make(chan struct{})
go func() {
wg.Wait()
close(done)
}()
<p>select {
case <-done:
fmt.Println("All goro
utines finished")
case <-time.After(5 * time.Second):
fmt.Println("Timeout: some tasks still running")
}注意:超时不会终止正在运行的 goroutine,仅放弃等待 —— 若需取消任务,请配合 context.Context 使用。
以上就是如何使用Golang实现WaitGroup等待协程完成_同步多任务执行的详细内容,更多请关注其它相关文章!
# 是一个
# 冷水江关键词排名优化
# 福州便宜的网站建设
# 优化网站为什么那么贵
# 河东区品牌网站建设对象
# 青海抖音seo关键词排名哪家好
# 株洲知名seo公司排名
# 青海网站建设方案外包
# 闽清企业seo哪家好
# seo培训资料
# 网页设计视频网站建设
# 若需
# 进阶
# go
# 不同类型
# 结束时
# 布尔
# 如何使用
# 抠图
# 死锁
# 同步机制
# 并发请求
# 解决方法
# ai
# go语言
# golang
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
圆通快递包裹轨迹查询 圆通速递快件实时位置跟踪
《金山词霸》语音翻译方法
《雷电模拟器》自动点击设置方法
六级准考证号怎么查_四六级准考证查询入口官网
铁拳8在线玩 铁拳8在线秒玩入口
高德地图怎么查看未来行程规划_高德地图未来行程规划查看方法
教育查询官方网站入口 教育个人档案查询免费官网
纯CSS实现自适应宽度与响应式布局的水平按钮组
使用CSS :has() 选择器实现父元素样式控制:从子元素反向应用样式
《美篇》取消会员自动续费方法
多闪电脑版下载_多闪PC端模拟器使用
《盗墓笔记手游》技能介绍
《i莞家》修改昵称方法
背部总是隐隐作痛怎么回事 背痛如何改善
喜茶GO更换登录账号方法
win11资源管理器标签页怎么用 Win11文件管理器多标签高效操作【新功能】
《火影忍者:木叶高手》快速升级攻略
Python测试中模块导入路径解析的最佳实践
PHP中动态类名访问的类实例类型提示与静态分析实践
阿里旺旺电脑网页版入口 阿里旺旺电脑版网页登录入口
顺丰快递在线查询系统 顺丰快递官方查单入口
PySimpleGUI中实现键盘按键与按钮事件绑定教程
申通快递查询 申通物流快递单实时查询入口
TikTok网页版入口快速访问 TikTok官网账号登录方法
冬季去寒冷地区旅游,以下哪种做法有助于缓解冻伤
Win10如何关闭操作中心通知 Win10免打扰设置全攻略【清爽】
《爱笔思画x》涂色教程
小红书网页版怎么进 小红书网页版通用入口
暴风影音官网正式版_暴风影音手机版官网下载安卓
解决VS Code中Python版本冲突与输出异常的指南
《微信》视频号原创声明开启方法
《360浏览器》自动保存账号密码设置方法
iPhone17Pro如何连接蓝牙耳机_iPhone17Pro蓝牙设备配对与连接方法介绍
Fedora怎么安装 Fedora Workstation安装步骤
Python csv 模块处理非字符串数据:列表写入 CSV 文件的机制解析
苹果iPhone14ProMax如何新建AppleID_iPhone14ProMax新建AppleID具体流程
苹果17 Pro如何启用分屏浏览_iPhone 17 Pro分屏浏览设置步骤
极兔快递官网查询入口手机版 手机极兔快递登录查询入口官方
百度网盘网页入口链接分享 百度网盘官网入口网页登录
更换小红书群背景怎么换?小红书群规则怎么设置?
PHP实现等比数列:构建数组元素基于前一个值递增的方法
windows10怎么开启卓越性能_windows10电源选项代码激活
获取WooCommerce产品在后台编辑页面的分类ID
ExcelSCAN与LAMBDA如何创建自定义移动平均函数_SCAN实现任意窗口期移动平均计算
三星M34录音变声问题_Samsung M34麦克风调整
申通快件单号查询平台 申通包裹物流动态跟踪
B站怎么快速升级 B站用户等级提升攻略【详解】
C++ optional用法详解_C++17处理可能为空的返回值
《地下城堡4:骑士与破碎编年史》墓穴挑战125攻略
C++ bind函数使用教程_C++参数绑定与函数适配器的应用
2025-12-19
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。