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

news2024/11/16 5:50:03

场景

Avito是一名校车司机,他帮助4个Gopher孩子上学。每天,Avito在他们的社区等待孩子们。他不知道孩子们需要多长时间,但他确切地知道有4个孩子他需要等待。

1f83d3a42168b86cb20f4a40bb2c46dd.png
1*aZnEggopv4Tsbyyj3e5JFg.png

当一个孩子准备好时,他/她会说:Done(),将计数器减1。Avito仍然被阻塞,因为计数器仍然大于0。他必须等到所有其他孩子准备好。

58d79d0dae2e0697c1b55c127815dce0.png
1*qouGWmMAqY2CDrzz5widhQ.png

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

165e096cd0a5945983a8bdc41594df20.png
1*057bX4zo_LCzEkdzGyDYpA.png

在最后一个孩子准备好后,Avito启动引擎,将他们送到学校。

af2c92caf10e838b7f80e03b3812c797.png
1*rjH8OR3t7QgUx-dO-Iszeg.png

就是这样!正如我所说,sync.WaitGroup很简单。

超时

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

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 - 体育老师,在学生中主持比赛。他向WaitGroupAdd(1),并要求所有孩子在相同的WaitGroupWait()

7211eba3e3606da7ce01f8f0efcfd83d.png
1*btDQK4QKsu1HkEpfJDa2EA.png

当Torcher调用wg.Done()时,计数器变为0,允许所有孩子同时开始奔跑。

759f0b500c2eba454a2a7eaf39a77aaa.png
1*VkV3VlRTx5jxXhauBH0_Dg.png

展示你的代码!

package main


import (
    "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.coloradmin.cn/o/1121774.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

跨境干货 | 如何搭建自己的独立站?

很多跨境电商在第三方平台经营许久后&#xff0c;会想摆脱第三方规则的限制建立起自己的品牌。 对于新手来说建立独立站是很有挑战的&#xff0c;建立独立站前首先我们需要了解一下什么是独立站&#xff1f;从字面意思来理解就是拥有属于自己的网站自己搭建跨境独立站&#xff…

【Python语言速回顾】——基础语法

目录 引入 一、PEP8代码规范和风格 二、变量和数据 1、变量 2、运算符 三、三种程序结构 1、分支结构 2、循环结构 四、组合数据类型 1、列表&#xff08;list&#xff09; 2、元组&#xff08;tuple&#xff09; 3、字典&#xff08;dict&#xff09; 5、集合&…

Python学习基础笔记七十七——json序列化

客户端和服务端之间需要交换数据才能完成各种功能。 假设 服务端程序都是用Python语言开发的话&#xff0c;那么 服务端从数据库中获取的最近的交易列表&#xff0c;可能就是像下面这样的一个Python列表对象&#xff1a; historyTransactions [{time : 20170101070311, #…

LoadRunner录制脚本+编写脚本

LoadRunner安装* 为什么选择LoadRunner 1&#xff09;Jmeter没有录制功能 2&#xff09;可以设计非常非常丰富的测试场景 3&#xff09;LoadRunner能够产出非常丰富的测试报告 LoadRunner三大组件的关系 每个组件是干什么的 VUG&#xff1a;录制脚本&#xff0c;&#xff…

天梯赛:L1-005 考试座位号

每个 PAT 考生在参加考试时都会被分配两个座位号&#xff0c;一个是试机座位&#xff0c;一个是考试座位。正常情况下&#xff0c;考生在入场时先得到试机座位号码&#xff0c;入座进入试机状态后&#xff0c;系统会显示该考生的考试座位号码&#xff0c;考试时考生需要换到考试…

线程是如何进行创建的

对于任何一个进程来讲&#xff0c;即便我们没有主动去创建线程&#xff0c;进程也是默认有一个主线程的。线程是负责执行二进制指令的&#xff0c;它会根据项目执行计划书&#xff0c;一行一行执行下去。进程要比线程管的宽多了&#xff0c;除了执行指令之外&#xff0c;内存、…

局域网下多台windows电脑时间同步

windows时间同步 最近在项目中遇见了多台windows电脑的时间同步问题。在这个项目中&#xff0c;有五台电脑&#xff0c;五台电脑处于同一局域网下&#xff0c;其中有一台可以连接互联网&#xff08;A电脑&#xff09;。我需要将其他四台电脑&#xff08;B、C、D、E电脑&#xf…

在Word中,图片显示不全

在今天交作业的时候&#xff0c;发现了一个非常SB的事情&#xff0c;把图片复制过去显示不完全&#xff1a; 使用文心一言查看搜索了一下&#xff0c;发现可能是以下几种原因&#xff1a; 图片所在行的行高设置不正确。可以重新设置行高&#xff0c;具体步骤包括打开图片显示…

【Java基础面试三十八】、请介绍Java的异常接口

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;请介绍Java的异常接口 …

LabVIEW中PID控制的的高级功能

LabVIEW中PID控制的的高级功能 比例-积分-微分&#xff08;PID&#xff09;控制占当今控制和自动化应用的90%以上&#xff0c;主要是因为它是一种有效且简单的解决方案。虽然PID算法最初用于线性、时不变系统&#xff0c;但现在已经发展到控制具有复杂动力学的系统。在现实世界…

git_笔记

git 学习视频 【【狂神说Java】Git最新教程通俗易懂】 https://www.bilibili.com/video/BV1FE411P7B3/?p10&share_sourcecopy_web&vd_source271b4386fd06dbbfd6504cf65bb85f31 git的下载与安装 git官网&#xff1a; https://git-scm.com/book/zh/v2/%E8%B5%B7%E6%…

MATLAB关于线性优化和整数线性优化

1.线性优化 x linprog(f,A,b,Aeq,beq,ub.lb) A&#xff0c;b是不等式约束Ax<b中的矩阵A与向量b&#xff0c; Aeq&#xff0c;beq是等式约束中的矩阵Aeq与向量beq&#xff0c; ub&#xff0c;lb是决策变量上下界 2.混合整数线性优化函数 x intlinprog(f,intcon,A,b,Aeq,beq…

【数据结构】面试OJ题——时间复杂度

目录 一&#xff1a;旋转数组 思路&#xff1a; 二&#xff1a;消失的数字 思路&#xff1a; 一&#xff1a;旋转数组 189. 轮转数组 - 力扣&#xff08;LeetCode&#xff09; 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负…

模板(进阶)

文章目录 1.非类型模板参数1.1 定义&#xff1a;1.2 应用&#xff1a; 2.模板特化&#xff08;特化必须原模版&#xff09;2.1类模板特化2.2 函数模板特化 3模板的分离编译3.1 什么是分离编译3.2模板不能实现分离编译的原因&#xff08;简&#xff09;&#xff1a;3.3解决方法实…

VBA技术资料MF72:利用函数判断文件及工作表存在

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…

初始c++(2)

目录 目录&#xff1a; 1. 引用 2. 内联函数inline 3.auto关键字(大概的认识) 4.基于范围的for循环(c11) 5.nullptr(c11) 本章最重要的知识点其实是前两个(详细讲解),后面的大概只会介绍一下用法。 文章开始&#xff01;&#xff01;&#xff01;&#xff01; 1&#xff1a;引…

微信小程序授权登录介绍

目录 一. 小程序登录如何获取微信用户信息 二. 小程序微信授权登录示例 后台代码 小程序代码 效果展示 三. 微信emoji存储问题 一. 小程序登录如何获取微信用户信息 小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识&#xff0c;快速建立小程序内…

【ArcGIS模型构建器】01:模型构建器Model Builder介绍

文章目录 一、 空间建模概述1. 空间建模概述2. 空间建模步骤 二、Model Builder建模1. Model Builder基础2. Model Builder操作3. Model Builder高级进阶操作 一、 空间建模概述 1. 空间建模概述 空间建模的目的是解决与地理有关的问题&#xff0c;通常涉及多种空间分析操作的…

100097. 合法分组的最少组数

给你一个长度为 n 下标从 0 开始的整数数组 nums 。 我们想将下标进行分组&#xff0c;使得 [0, n - 1] 内所有下标 i 都 恰好 被分到其中一组。 如果以下条件成立&#xff0c;我们说这个分组方案是合法的&#xff1a; 对于每个组 g &#xff0c;同一组内所有下标在 nums 中…

一天吃透Java面试题

给大家分享我整理的Java高频面试题&#xff0c;有小伙伴靠他拿到字节offer了。 Java基础面试题 Java的特点Java 与 C 的区别JDK/JRE/JVM三者的关系Java程序是编译执行还是解释执行&#xff1f;面向对象和面向过程的区别&#xff1f;面向对象有哪些特性&#xff1f;数组到底是…