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

Go并发可视化解释:sync.WaitGroup

来源: 责编: 时间:2023-10-23 17:05:57 437观看
导读场景Avito是一名校车司机,他帮助4个Gopher孩子上学。每天,Avito在他们的社区等待孩子们。他不知道孩子们需要多长时间,但他确切地知道有4个孩子他需要等待。1*aZnEggopv4Tsbyyj3e5JFg.png当一个孩子准备好时,他/她会说:Don

场景

Avito是一名校车司机,他帮助4个Gopher孩子上学。每天,Avito在他们的社区等待孩子们。他不知道孩子们需要多长时间,但他确切地知道有4个孩子他需要等待。zw828资讯网——每日最新资讯28at.com

zw828资讯网——每日最新资讯28at.com

1*aZnEggopv4Tsbyyj3e5JFg.pngzw828资讯网——每日最新资讯28at.com

当一个孩子准备好时,他/她会说:Done(),将计数器减1。Avito仍然被阻塞,因为计数器仍然大于0。他必须等到所有其他孩子准备好。zw828资讯网——每日最新资讯28at.com

zw828资讯网——每日最新资讯28at.com

1*qouGWmMAqY2CDrzz5widhQ.pngzw828资讯网——每日最新资讯28at.com

如果有两个孩子同时准备好,它们的同时准备会导致WaitGroup出现不一致吗?绝对不会。与sync包中的大多数其他组件一样,WaitGroup具有内置的同步机制,以处理并发。因此,计数器减少了准备好的孩子数量。zw828资讯网——每日最新资讯28at.com

zw828资讯网——每日最新资讯28at.com

1*057bX4zo_LCzEkdzGyDYpA.pngzw828资讯网——每日最新资讯28at.com

在最后一个孩子准备好后,Avito启动引擎,将他们送到学校。zw828资讯网——每日最新资讯28at.com

zw828资讯网——每日最新资讯28at.com

1*rjH8OR3t7QgUx-dO-Iszeg.pngzw828资讯网——每日最新资讯28at.com

就是这样!正如我所说,sync.WaitGroup很简单。zw828资讯网——每日最新资讯28at.com

超时

如果一个孩子花费太多时间准备,他们会不会因此迟到?如果Avito在时间到达时不管怎样都开始行驶会更好吗?嗯,Golang倾向于保持一切尽可能简洁,因此与其他编程语言中的CountDownLatch(例如Java中的)不同,sync.WaitGroup默认情况下不支持超时。在这种情况下,选择语句可能会有所帮助。zw828资讯网——每日最新资讯28at.com

func main() {    wg := sync.WaitGroup{}    wg.Add(1)    go func() {        defer wg.Done()        time.Sleep(5 * time.Second)    }()    done := make(chan bool)    go func() {        wg.Wait()        close(done)    }()    select {    case <-done:        log.Println("All done")    case <-time.After(1 * time.Second):        log.Println("Hit timeout")    }}

孩子等待

在上面的示例中,Avito(主Goroutine)等待孩子(子Goroutines)。当我们希望子Goroutines等待主Goroutine时,WaitGroup也可以使用。想象一下孩子们正在进行体育课。Torcher - 体育老师,在学生中主持比赛。他向WaitGroup中Add(1),并要求所有孩子在相同的WaitGroup上Wait()。zw828资讯网——每日最新资讯28at.com

zw828资讯网——每日最新资讯28at.com

1*btDQK4QKsu1HkEpfJDa2EA.pngzw828资讯网——每日最新资讯28at.com

当Torcher调用wg.Done()时,计数器变为0,允许所有孩子同时开始奔跑。zw828资讯网——每日最新资讯28at.com

zw828资讯网——每日最新资讯28at.com

1*VkV3VlRTx5jxXhauBH0_Dg.pngzw828资讯网——每日最新资讯28at.com

展示你的代码!

package mainimport (    "log"    "sync"    "time")func main() {    kids := []string{"Partier", "Stringer", "Candier", "Swimmer"}    wg := sync.WaitGroup{}    wg.Add(len(kids))    for _, kid := range kids {        go func(name string) {            defer wg.Done()            prepare(name)        }(kid)    }    log.Printf("Avito: I'm waiting for %d kids/n", len(kids))    wg.Wait()    log.Println("Avito: The kids are all ready, go!")}func prepare(name string) {    log.Printf("%v: I'm preparing for school/n", name)    time.Sleep(2 * time.Second)    log.Printf("%v: I'm ready/n", name)}

本文链接:http://www.28at.com/showinfo-26-14610-0.htmlGo并发可视化解释:sync.WaitGroup

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

上一篇: private final、@Autowired、@Resource你更喜欢哪个?

下一篇: Fiber Golang:Golang中的强大Web框架

标签:
  • 热门焦点
  • 卢伟冰长文解析K60至尊版 对Redmi有着里程碑式的意义

    在今天的Redmi后性能时代战略发布会结束之后,Redmi总经理卢伟冰又带来了一篇长文,详解了为什么 Redmi 要开启后性能时代?为什么选择和 MediaTek、Pixelworks 深度合作?以及后性
  • 天猫精灵Sound Pro体验:智能音箱没有音质?来听听我的

    这几年除了手机作为智能生活终端最主要的核心之外,第二个可以成为中心点的产品是什么?——是智能音箱。 手机在执行命令的时候有两种操作方式,手和智能语音助手,而智能音箱只
  • vivo TWS Air开箱体验:真轻 臻好听

    在vivo S15系列新机的发布会上,vivo的最新款真无线蓝牙耳机vivo TWS Air也一同发布,本次就这款耳机新品给大家带来一个简单的分享。外包装盒上,vivo TWS Air保持了vivo自家产
  • 线程通讯的三种方法!通俗易懂

    线程通信是指多个线程之间通过某种机制进行协调和交互,例如,线程等待和通知机制就是线程通讯的主要手段之一。 在 Java 中,线程等待和通知的实现手段有以下几种方式:Object 类下
  • 不容错过的MSBuild技巧,必备用法详解和实践指南

    一、MSBuild简介MSBuild是一种基于XML的构建引擎,用于在.NET Framework和.NET Core应用程序中自动化构建过程。它是Visual Studio的构建引擎,可在命令行或其他构建工具中使用
  • 谷歌KDD'23工作:如何提升推荐系统Ranking模型训练稳定性

    谷歌在KDD 2023发表了一篇工作,探索了推荐系统ranking模型的训练稳定性问题,分析了造成训练稳定性存在问题的潜在原因,以及现有的一些提升模型稳定性方法的不足,并提出了一种新
  • 多线程开发带来的问题与解决方法

    使用多线程主要会带来以下几个问题:(一)线程安全问题  线程安全问题指的是在某一线程从开始访问到结束访问某一数据期间,该数据被其他的线程所修改,那么对于当前线程而言,该线程
  • 使用LLM插件从命令行访问Llama 2

    最近的一个大新闻是Meta AI推出了新的开源授权的大型语言模型Llama 2。这是一项非常重要的进展:Llama 2可免费用于研究和商业用途。(几小时前,swyy发现它已从LLaMA 2更名为Lla
  • AI芯片初创公司Tenstorrent获三星和现代1亿美元投资

    Tenstorrent是一家由芯片行业资深人士Jim Keller领导的加拿大初创公司,专注于开发人工智能芯片,该公司周三表示,已经从现代汽车集团和三星投资基金等
Top