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

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

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

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

sync.WaitGroup

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

注意事项

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

sync.Once

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

注意事项

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

结合使用示例

我们可以结合 sync.WaitGroup 和 sync.Once,来完成一个更复杂的并发任务。假设我们有一个初始化操作,只需执行一次,但在多个 goroutine 中执行其他任务。05x28资讯网——每日最新资讯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 完成后,程序才会继续执行。05x28资讯网——每日最新资讯28at.com

总结

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

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

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

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

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

标签:
  • 热门焦点
  • MIX Fold3包装盒泄露 新机本月登场

    小米的全新折叠屏旗舰MIX Fold3将于本月发布,近日该机的真机包装盒在网上泄露。从图上来看,新的MIX Fold3包装盒在外观设计方面延续了之前的方案,变化不大,这也是目前小米旗舰
  • 6月安卓手机好评榜:魅族20 Pro蝉联冠军

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年6月1日至6月30日,仅限国内市场。第一名:魅族20 Pro好评率:95%5月份的时候魅族20 Pro就是
  • 企业采用CRM系统的11个好处

    客户关系管理(CRM)软件可以为企业提供很多的好处,从客户保留到提高生产力。  CRM软件用于企业收集客户互动,以改善客户体验和满意度。  CRM软件市场规模如今超过580
  • 如何使用JavaScript创建一只图像放大镜?

    译者 | 布加迪审校 | 重楼如果您曾经浏览过购物网站,可能遇到过图像放大功能。它可以让您放大图像的特定区域,以便浏览。结合这个小小的重要功能可以大大改善您网站的用户体验
  • 一文搞定Java NIO,以及各种奇葩流

    大家好,我是哪吒。很多朋友问我,如何才能学好IO流,对各种流的概念,云里雾里的,不求甚解。用到的时候,现百度,功能虽然实现了,但是为什么用这个?不知道。更别说效率问题了~下次再遇到,
  • 使用AIGC工具提升安全工作效率

    在日常工作中,安全人员可能会涉及各种各样的安全任务,包括但不限于:开发某些安全工具的插件,满足自己特定的安全需求;自定义github搜索工具,快速查找所需的安全资料、漏洞poc、exp
  • 当家的盒马,加速谋生

    来源 | 价值星球Planet作者 | 归去来自己&ldquo;当家&rdquo;的盒马,开始加速谋生了。据盒马官微消息,盒马计划今年开放生鲜供应链,将其生鲜商品送往食堂。目前,盒马在上海已经与
  • iQOO Neo8 Pro即将开售:到手价3099元起 安卓性能最强旗舰

    5月23日,iQOO如期举行了新品发布会,全新的iQOO Neo8系列也正式与大家见面,包含iQOO Neo8和iQOO Neo8 Pro两个版本,其中标准版搭载高通骁龙8+,而Pro版更
  • 苹果140W USB-C充电器:采用氮化镓技术

    据10 月 30 日 9to5 Mac 消息报道,当苹果推出新的 MacBook Pro 2021 时,该公司还推出了新的 140W USB-C 充电器,附赠在 MacBook Pro 16 英寸机型的盒子里,也支
Top