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

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

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

场景

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

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

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

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

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

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

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

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

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

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

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

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

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

超时

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

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

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

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

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

1*VkV3VlRTx5jxXhauBH0_Dg.pngqRB28资讯网——每日最新资讯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框架

标签:
  • 热门焦点
  • 5月iOS设备性能榜:M1 M2依旧是榜单前五

    和上个月一样,没有新品发布的iOS设备性能榜的上榜设备并没有什么更替,仅仅只有跑分变化而产生的排名变动,刚刚开始的苹果WWDC2023,推出的产品也依旧是新款Mac Pro、新款Mac Stu
  • 之家push系统迭代之路

    前言在这个信息爆炸的互联网时代,能够及时准确获取信息是当今社会要解决的关键问题之一。随着之家用户体量和内容规模的不断增大,传统的靠"主动拉"获取信息的方式已不能满足用
  • 多线程开发带来的问题与解决方法

    使用多线程主要会带来以下几个问题:(一)线程安全问题  线程安全问题指的是在某一线程从开始访问到结束访问某一数据期间,该数据被其他的线程所修改,那么对于当前线程而言,该线程
  • 使用AIGC工具提升安全工作效率

    在日常工作中,安全人员可能会涉及各种各样的安全任务,包括但不限于:开发某些安全工具的插件,满足自己特定的安全需求;自定义github搜索工具,快速查找所需的安全资料、漏洞poc、exp
  • 10天营收超1亿美元,《星铁》比《原神》差在哪?

    来源:伯虎财经作者:陈平安即便你没玩过《原神》,你一定听说过的它的大名。恨它的人把《原神》开服那天称作是中国游戏史上最黑暗的一天,有粉丝因为索尼在PS平台上线《原神》,怒而
  • 微博大门常打开,迎接海外画师漂洋东渡

    作者:互联网那些事&ldquo;起猛了,我能看得懂日语了&rdquo;。&ldquo;为什么日本人说话我能听懂?&rdquo;&ldquo;中文不像中文,日语不像日语,但是我竟然看懂了&rdquo;&hellip;&hell
  • iQOO Neo8 Pro评测:旗舰双芯加持 最强性能游戏旗舰

    【Techweb评测】去年10月,iQOO推出了一款Neo7手机,该机搭载了联发科天玑9000+,配备独显芯片Pro+,带来了同价位段最佳的游戏体验,一经上市便受到了诸多用
  • OPPO K11样张首曝:千元机影像“卷”得真不错!

    一直以来,OPPO K系列机型都保持着较为均衡的产品体验,历来都是2K价位的明星机型,去年推出的OPPO K10和OPPO K10 Pro两款机型凭借各自的出色配置,堪称有
  • AI艺术欣赏体验会在上海梅赛德斯奔驰中心音乐俱乐部上演

    光影交错的镜像世界,虚实幻化的视觉奇观,虚拟偶像与真人共同主持,这些场景都出现在2019世界人工智能大会的舞台上。8月29日至31日,“AI艺术欣赏体验会”在上海
Top