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

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

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

场景

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

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

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

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

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

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

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

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

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

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

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

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

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

超时

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

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

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

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

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

1*VkV3VlRTx5jxXhauBH0_Dg.pngmJc28资讯网——每日最新资讯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-14622-0.htmlGo并发可视化解释:sync.WaitGroup

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

上一篇: ELK Stack生产实践——pod日志采集(Elastic Agent方案)

下一篇: 2023 年 WebAssembly 现状:第四种 Web 语言

标签:
  • 热门焦点
  • vivo TWS Air开箱体验:真轻 臻好听

    在vivo S15系列新机的发布会上,vivo的最新款真无线蓝牙耳机vivo TWS Air也一同发布,本次就这款耳机新品给大家带来一个简单的分享。外包装盒上,vivo TWS Air保持了vivo自家产
  • Rust中的高吞吐量流处理

    作者 | Noz编译 | 王瑞平本篇文章主要介绍了Rust中流处理的概念、方法和优化。作者不仅介绍了流处理的基本概念以及Rust中常用的流处理库,还使用这些库实现了一个流处理程序
  • 掘力计划第 20 期:Flutter 混合开发的混乱之治

    在掘力计划系列活动第20场,《Flutter 开发实战详解》作者,掘金优秀作者,Github GSY 系列目负责人恋猫的小郭分享了Flutter 混合开发的混乱之治。Flutter 基于自研的 Skia 引擎
  • 把LangChain跑起来的三个方法

    使用LangChain开发LLM应用时,需要机器进行GLM部署,好多同学第一步就被劝退了,那么如何绕过这个步骤先学习LLM模型的应用,对Langchain进行快速上手?本片讲解3个把LangChain跑起来
  • 新电商三兄弟,“抖快红”成团!

    来源:价值研究所作 者:Hernanderz 随着内容电商的概念兴起,抖音、快手、小红书组成的&ldquo;新电商三兄弟&rdquo;成为业内一股不可忽视的势力,给阿里、京东、拼多多带去了巨大压
  • 认真聊聊东方甄选:如何告别低垂的果实

    来源:山核桃作者:财经无忌爆火一年后,俞敏洪和他的东方甄选依旧是颇受外界关心的&ldquo;网红&rdquo;。7月5日至9日,为期5天的东方甄选&ldquo;甘肃行&rdquo;首次在自有App内直播,
  • OPPO、vivo、小米等国内厂商Q2在印度智能手机市场份额依旧高达55%

    7月20日消息,据外媒报道,研究机构的报告显示,在全球智能手机出货量同比仍在下滑的大背景下,印度这一有潜力的市场也未能幸免,出货量同比也有下滑,多家厂
  • 苹果、三星、惠普等暂停向印度出口笔记本和平板电脑

    集微网消息,据彭博社报道,在8月3日印度突然禁止在没有许可证的情况下向印度进口电脑/平板及显示器等产品后,苹果、三星电子和惠普等大公司暂停向印度
  • 亲历马斯克血洗Twitter,硅谷的苦日子在后头

    文/刘哲铭  编辑/李薇  马斯克再次挥下裁员大刀。  美国时间11月14日,Twitter约4400名外包员工遭解雇,此次被解雇的员工的主要工作为内容审核等。此前,T
Top