GO:同步工具WaitGroup

news/2024/12/18 12:45:06/文章来源:https://www.cnblogs.com/niumachen/p/18614617

什么是 WaitGroup?

WaitGroup 是 Go 的标准库 sync 包中提供的一种并发控制工具,用于等待一组 goroutine 完成工作。它非常适合在主线程需要等待一组 goroutine 全部完成时使用。


通俗解释

可以把 WaitGroup 想象成一个计数器:

  1. 启动任务时:给计数器加 1。
  2. 任务完成时:给计数器减 1。
  3. 等待所有任务完成时:程序会阻塞,直到计数器变为 0。

用生活中的例子理解:

  • 一个老师(主 goroutine)安排 3 个学生(goroutines)做作业。
  • 每个学生做完后告诉老师。
  • 老师会等所有学生都完成后才下班(主 goroutine 退出)。

基本用法

sync.WaitGroup 的主要方法:

  1. Add(delta int):增加或减少计数器值。
  2. Done():减少计数器值(等价于 Add(-1))。
  3. Wait():阻塞当前 goroutine,直到计数器变为 0。

示例代码:

package mainimport ("fmt""sync""time"
)func worker(id int, wg *sync.WaitGroup) {defer wg.Done() // 任务完成时调用 Donefmt.Printf("Worker %d starting\n", id)time.Sleep(time.Second) // 模拟工作fmt.Printf("Worker %d done\n", id)
}func main() {var wg sync.WaitGroup// 启动 3 个 goroutinefor i := 1; i <= 3; i++ {wg.Add(1) // 增加计数器go worker(i, &wg)}wg.Wait() // 等待所有 goroutine 完成fmt.Println("All workers done")
}

输出结果:

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

关键点解析

  1. wg.Add(1)
    每次启动一个 goroutine,计数器加 1。

  2. defer wg.Done()
    每个 goroutine 完成任务时,计数器减 1。

  3. wg.Wait()
    主 goroutine 阻塞,直到计数器变为 0,表示所有 goroutine 都完成了工作。


注意事项

  1. 必须匹配 AddDone
    每个 Add 对应一个 Done,否则程序会死锁。

  2. 调用顺序
    在调用 Wait() 之前,Add 的操作必须完成;否则可能导致意外行为。

  3. 避免重复使用
    一个 WaitGroup 实例只能用于一组任务,任务完成后不能重用。


总结

  • WaitGroup 是 Go 中用于管理并发任务的一种同步工具。
  • 通过计数器机制,可以确保主线程等待所有 goroutine 完成后再继续执行。
  • 它是 Go 并发编程中常用的基础工具之一。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/854759.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大学微积分 AB 第四单元:区分的语境应用

(先略)根据上下文解释导数的含义 定的。

欢迎 PaliGemma 2 – 来自 Google 的新视觉语言模型

我们很高兴迎来 Google 全新的视觉语言模型 PaliGemma 2,这是 PaliGemma 的一个新版本。与其前代产品一样,PaliGemma 2 使用强大的 SigLIP 进行视觉处理,但在文本解码部分升级到了最新的 Gemma 2。 模型规模和输入分辨率 PaliGemma 2 提供了新的预训练模型,参数规模包括 3B…

Win11 OneDrive 报错 0x8004def5

突然发现我运行了8万多小时的硬盘报 C5 警告了…抓紧换了块硬盘懒得重装系统直接pe下把文件拷贝到新盘启动后 OneDrive 报错 0x8004def5…参考下:https://www.minitool.com/news/onedrive-error-code-0x8004def5.html简单判断我这个肯定没那么复杂肯定是直接拷贝文件造成的配…

Linux 网页管理工具cockpit使用

无意间在网上看到一款使用比较方便的Linux网页管理工具,感觉很强大,对Linux新手很有用。 平时centos用的比较多,一下以centos7为例,简单列出部署过程。 Cockpit 包通常在 EPEL仓库中提供,需要先下载epel源 yum install -y epel-release.noarch yum clean all yum makecach…

BOE(京东方)“向新2025”年终媒体智享会首站落地上海 六大维度创新开启产业发展新篇章

12月17日,BOE(京东方)以“向新2025”为主题的年终媒体智享会在上海启动。正值BOE(京东方)新三十年的开局之年,活动全面回顾了2024年BOE(京东方)在各领域所取得的领先成果,深度解读了六大维度的“向新”发展格局,同时详细剖析了BOE(京东方)在智能制造领域的领先实践…

如何用管理计划软件制定并落实新年规划,提升团队效率

一、年度规划的重要性 1.1 为什么需要年度规划? 无论是个人职业规划、部门目标还是公司的战略计划,年度规划为每个目标的实现提供了清晰的路线图。一个好的年度规划能够帮助团队明确年度任务,优化资源分配,提高工作效率,并且提供可量化的标准来衡量成果。 具体来说,年度规…

搭建overleaf

1.领取免费服务器,推荐免费服务器(SanFengYun)见下图。2.安装宝塔面板,配置内网为127.0.0.1,访问外网地址。 3.可以在宝塔面板一键部署网站,输入自己的域名即可。 4.关键:安装docker,安装yum,设置github可以访问。 5.更换docker镜像,自带镜像无法访问 6.按照overleaf…

Linux服务器中ping时出现“未知的名称或服务”或“Name or service not known”的解决办法

ping qyapi.weixin.qq.com Name or service not known【背景】接入企业微信时遇到服务器上ping qyapi.weixin.qq.com,报错Name or service not known 【解决办法】 1、# vi /etc/resolv.conf 增加一行 nameserver 8.8.8.82、重启网络 # service network restart3、验证ping成功…

组件 画线渲染 拖尾

了解属性 挂载脚本 还可以设置开始颜色宽度结束颜色等补充

画线渲染 拖尾

了解属性 挂载脚本 补充

LLaMA (以LLaMA2为例,文末附加对比1 2 3 三个版本的变化)

一、背景 LLaMA 2 和 LLaMA2-Chat 参数规模:70亿、130亿和700亿 数据和训练规模: 上下文长度 训练资源 性能表现: 二、预训练 pretraining 1. 预训练数据训练语料来自公开课用的数据源,不包括Meta的产品或服务数据在2万亿个数据tokens上进行了训练对真实的数据源进行…

手把手教会你电脑端如何长截屏~

如果在电脑端想拿到这样的长截图,教你一个方法,不需要下载软件 首先需要先下载一个小插件 需要下载滚动截屏所需的插件 然后解压 zip 包 下载好插件后,对 .zip 包进行解压,解压后文件夹里面有个 .crx 后缀的离线安装包,大致如下图所示:打开扩展程序管理菜单 接下来,打开…