当前位置:首页 > 科技  > 软件

sync.WaitGroup和sync.Once的爱恨情仇

来源: 责编: 时间:2024-06-05 17:38:10 87观看
导读今天,我们将继续探讨Go语言中的两个重要的同步工具:sync.WaitGroup 和 sync.Once。sync.WaitGroupsync.WaitGroup 是Go语言中的一种计数信号量,用于等待一组 goroutine 完成。它常用于等待一组并发任务全部完成后再继续

今天,我们将继续探讨Go语言中的两个重要的同步工具:sync.WaitGroup 和 sync.Once。y8M28资讯网——每日最新资讯28at.com

sync.WaitGroup

sync.WaitGroup 是Go语言中的一种计数信号量,用于等待一组 goroutine 完成。它常用于等待一组并发任务全部完成后再继续执行。y8M28资讯网——每日最新资讯28at.com

使用方法

  1. 声明一个 sync.WaitGroup 类型的变量。
  2. 在每个 goroutine 启动之前调用 Add 方法,增加等待计数。
  3. 在每个 goroutine 完成时调用 Done 方法,减少等待计数。
  4. 在主 goroutine 中调用 Wait 方法,阻塞直到所有 goroutine 完成。

示例代码

package mainimport (   "fmt"   "sync"   "time")func worker(id int, wg *sync.WaitGroup) {   defer wg.Done()   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 <= 5; i++ {       wg.Add(1)       go worker(i, &wg)  }   wg.Wait()   fmt.Println("All workers done")}

在这个例子中,main 函数启动了5个 goroutine,每个 goroutine 都会运行 worker 函数。每个 worker 在完成时调用 wg.Done(),而 main 函数会等待所有 worker 完成后再继续执行。y8M28资讯网——每日最新资讯28at.com

注意事项

  • WaitGroup 的计数器不能设为负数,否则会引发 panic。
  • 必须确保在所有 Done 调用之前已经调用了 Add。

sync.Once

sync.Once 是一个用于确保某些操作只执行一次的结构体。它提供了一种线程安全的方式来执行一次性初始化操作。y8M28资讯网——每日最新资讯28at.com

使用方法

  1. 声明一个 sync.Once 类型的变量。
  2. 使用 Do 方法执行需要仅执行一次的操作。

示例代码

package mainimport (   "fmt"   "sync")func initialize() {   fmt.Println("Initializing...")}func main() {   var once sync.Once   for i := 0; i < 10; i++ {       go func(i int) {           once.Do(initialize)           fmt.Printf("Goroutine %d/n", i)      }(i)  }   // 等待所有 goroutine 完成   var wg sync.WaitGroup   wg.Add(10)   for i := 0; i < 10; i++ {       go func() {           defer wg.Done()           once.Do(initialize)      }()  }   wg.Wait()}

在这个例子中,initialize 函数只会被执行一次,尽管有多个 goroutine 尝试调用 once.Do(initialize)。y8M28资讯网——每日最新资讯28at.com

注意事项

  • sync.Once 的 Do 方法接受一个无参函数。
  • 即使 Do 方法被多次调用,传入的函数也只会执行一次。

结合使用示例

我们可以结合 sync.WaitGroup 和 sync.Once,来完成一个更复杂的并发任务。假设我们有一个初始化操作,只需执行一次,但在多个 goroutine 中执行其他任务。y8M28资讯网——每日最新资讯28at.com

示例代码

package mainimport (   "fmt"   "sync"   "time")var (   once sync.Once   wg   sync.WaitGroup)func initialize() {   fmt.Println("Initializing...")   time.Sleep(2 * time.Second) // 模拟初始化耗时   fmt.Println("Initialization complete")}func worker(id int) {   defer wg.Done()   once.Do(initialize)   fmt.Printf("Worker %d starting/n", id)   time.Sleep(time.Second) // 模拟工作   fmt.Printf("Worker %d done/n", id)}func main() {   const numWorkers = 5   wg.Add(numWorkers)   for i := 1; i <= numWorkers; i++ {       go worker(i)  }   wg.Wait()   fmt.Println("All workers done")}

在这个例子中,initialize 函数只会执行一次,而 worker 函数会并发执行,等待所有 worker 完成后,程序才会继续执行。y8M28资讯网——每日最新资讯28at.com

总结

通过本文,我们了解了Go语言中的两个重要同步工具:sync.WaitGroup 和 sync.Once。sync.WaitGroup 用于等待一组 goroutine 完成,而 sync.Once 则确保某些操作只执行一次。这两个工具在实际开发中非常实用,能有效地帮助我们处理并发任务。y8M28资讯网——每日最新资讯28at.com

本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-92102-0.htmlsync.WaitGroup和sync.Once的爱恨情仇

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 九大微服务监控工具详解

下一篇: 别背八股文了,WebSocket 是什么,我劝你花几分钟让面试官惊艳!

标签:
  • 热门焦点
  • 小米降噪蓝牙耳机Necklace分享:听一首歌 读懂一个故事

    小米降噪蓝牙耳机Necklace分享:听一首歌 读懂一个故事

    在今天下午的小米Civi 2新品发布会上,小米还带来了一款新的降噪蓝牙耳机Necklace,我们也在发布结束的第一时间给大家带来这款耳机的简单分享。现在大家能见到最多的蓝牙耳机
  • K8S | Service服务发现

    K8S | Service服务发现

    一、背景在微服务架构中,这里以开发环境「Dev」为基础来描述,在K8S集群中通常会开放:路由网关、注册中心、配置中心等相关服务,可以被集群外部访问;图片对于测试「Tes」环境或者
  • 这款新兴工具平台,让你的电脑效率翻倍

    这款新兴工具平台,让你的电脑效率翻倍

    随着信息技术的发展,我们获取信息的渠道越来越多,但是处理信息的效率却成为一个瓶颈。于是各种工具应运而生,都在争相解决我们的工作效率问题。今天我要给大家介绍一款效率
  • Temu起诉SHEIN,跨境电商战事升级

    Temu起诉SHEIN,跨境电商战事升级

    来源 | 伯虎财经(bohuFN)作者 | 陈平安日前据外媒报道,拼多多旗下跨境电商平台Temu正对竞争对手SHEIN提起新诉讼,诉状称Shein&ldquo;利用市场支配力量强迫服装厂商与之签订独家
  • 大厂卷向扁平化

    大厂卷向扁平化

    来源:新熵作者丨南枝 编辑丨月见大厂职级不香了。俗话说,兵无常势,水无常形,互联网企业调整职级体系并不稀奇。7月13日,淘宝天猫集团启动了近年来最大的人力制度改革,目前已形成一
  • 东方甄选单飞:有些鸟注定是关不住的

    东方甄选单飞:有些鸟注定是关不住的

    文/彭宽鸿编辑/罗卿东方甄选创始人俞敏洪带队的&ldquo;7天甘肃行&rdquo;直播活动已在近日顺利收官。成立后一年多时间里,东方甄选要脱离抖音自立门户的传闻不绝于耳,&ldquo;7
  • AMD的AI芯片转单给三星可能性不大 与台积电已合作至2nm制程

    AMD的AI芯片转单给三星可能性不大 与台积电已合作至2nm制程

    据 DIGITIMES 消息,英伟达 AI GPU 出货逐季飙升,接下来 AMD MI 300 系列将在第 4 季底量产。而半导体业内人士表示,近日传出 AMD 的 AI 芯片将转单给
  • 2299元起!iQOO Pad明晚首销:性能最强天玑平板

    2299元起!iQOO Pad明晚首销:性能最强天玑平板

    5月23日,iQOO如期举行了新品发布会,除了首发安卓最强旗舰处理器的iQOO Neo8系列新机外,还在发布会上推出了旗下首款平板电脑——iQOO Pad,其最大的卖点
  • DRAM存储器10月价格下跌,NAND闪存本月价格与上月持平

    DRAM存储器10月价格下跌,NAND闪存本月价格与上月持平

    10月30日,据韩国媒体消息,自今年年初以来一直在上涨的 DRAM 存储器的交易价格仅在本月就下跌了近 10%,此次是全年首次降价,而NAND 闪存本月价格与上月持平。市
Top
Baidu
map