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 】
相关推荐:
如何取消数字签名
Sublime怎么格式化HTML代码_Sublime前端代码美化插件使用指南
cad加载的线型看不见怎么办_cad线型不可见问题解决方法
晨报|开发商暗示《空洞骑士:丝之歌》DLC开发中 《合金装备4》有望重制
AffinityDesigner图层蒙版怎么用_AffinityDesigner图层蒙版设计应用
Golang如何测试结构体方法_Golang reflect方法测试与调用技巧
支付宝登录刷脸不是本人如何解决
深入理解随机递归函数的确定性:内部节点、叶节点与时间复杂度分析
我的世界游戏平台入口 我的世界官方官网直达链接
如何通过settings.json个性化您的VS Code体验
msn官方入口2025登录 msn官网2025直达首页入口
《360浏览器》自动保存账号密码设置方法
抖音火山版如何进行提现
123平台官方登录入口 123邮箱网页端在线沟通工具
Python模块化编程:避免循环导入与共享函数的最佳实践
mysql归档数据怎么导出为csv_mysql归档数据导出为csv文件的方法
猫眼电影app如何参与官方的抽奖活动_猫眼电影官方抽奖参与方法
iSpring三分屏制作教程
纯CSS实现自适应宽度与响应式布局的水平按钮组
DeepSeek超全面指南:入门必看
解决CSS容器溢出问题:使用calc()实现精确布局与边距控制
《全民k歌》音乐怎么下载到本地2025
网站体验不好=浪费钱:如何提升-用户体验效果差
悟空浏览器网页版在线工具 悟空浏览器网页版在线平台入口
uc浏览器官网网页版使用 uc浏览器官网免费在线首页
Lar*el Eloquent:高效删除多对多关系中无关联子记录的父模型
《虎扑》取消评分记录方法
视频号视频怎么提取文案?提取的文案如何优化与使用?
PHP页面重载时变量值不重置的实现方法
Lar*el 中高效执行多列更新:单次查询实现
《荔枝fm》导出文件教程
《飞猪旅行》购买汽车票方法
51漫画网实时入口 51漫画网页版官方免费漫画入口
CSS如何控制元素外边距_margin实现布局间隔
win11如何诊断DirectX问题 Win11运行dxdiag工具排查显卡故障【排错】
极兔快递官网查询入口手机版 手机极兔快递登录查询入口官方
Win10运行窗口在哪里打开 Win10调出运行命令框快捷键【技巧】
J*aScript大数运算_BigInt使用指南
Lar*el Socialite单设备登录策略:实现用户唯一会话管理
苹果如何下载nanobanana
cad怎么隐藏指定的图层_cad隐藏或冻结图层方法
MongoDB聚合管道:高效统计列表中各项的文档数量
《气泡星球》兑换码礼包大全
VS Code中的Tailwind CSS IntelliSense插件使用技巧
鲁班大师乓乓皮肤获取方法
《U校园》学生登录入口2025
豆包AI怎样为教育场景定制答疑逻辑_为教育场景定制豆包AI答疑逻辑方案【方案】
123网页端官方登录页 123邮箱网页版即时通讯服务
Win10输入法不见了怎么办 Win10找回语言栏图标教程
Animex动漫社社登录官网 Animex动漫社资源社入口直达
2025-12-19
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。