当前位置: 首页 > news >正文

Golang之路---04 并发编程——WaitGroup

WaitGroup

为了保证 main goroutine 在所有的 goroutine 都执行完毕后再退出,前面使用了 time.Sleep 这种简单的方式。

由于写的 demo 都是比较简单的, sleep 个 1 秒,我们主观上认为是够用的。

但在实际开发中,开发人员是无法预知,所有的 goroutine 需要多长的时间才能执行完毕,sleep 多了,主程序就阻塞了, sleep 少了,有的子协程的任务就没法完成。

因此,使用time.Sleep 是一种极不推荐的方式,今天主要就要来介绍 一下如何优雅的处理这种情况。

1. 使用信道来标记完成

“不要通过共享内存来通信,要通过通信来共享内存”

学习了信道后,我们知道,信道可以实现多个协程间的通信,那么我们只要定义一个信道,在任务完成后,往信道中写入true,然后在主协程中获取到true,就认为子协程已经执行完毕。

import "fmt"func main() {done := make(chan bool)go func() {for i := 0; i < 5; i++ {fmt.Println(i)}done <- true}()<-done
}

2. 使用 WaitGroup

上面使用信道的方法,在单个协程或者协程数少的时候,并不会有什么问题,但在协程数多的时候,代码就会显得非常复杂。

那么有没有一种更加优雅的方式呢?

有,这就要说到 sync包 提供的 WaitGroup 类型。

WaitGroup 你只要实例化了就能使用

var 实例名 sync.WaitGroup

实例化完成后,就可以使用它的几个方法:

  • Add:初始值为0,你传入的值会往计数器上加,这里直接传入你子协程的数量

  • Done:当某个子协程完成后,可调用此方法,会从计数器上减一,通常可以使用 defer 来调用。

  • Wait:阻塞当前协程,直到实例里的计数器归零。

eg:

import ("fmt""sync"
)func worker(x int,wg *sync.WaitGroup){defer wg.Done()for i := 0;i<5; i++{fmt.Printf("worker %d: %d\n",x,i);}
}func main() {var wg sync.WaitGroupwg.Add(2)go worker(1,&wg)go worker(2,&wg)wg.Wait()
}

在这里插入图片描述

相关文章:

Golang之路---04 并发编程——WaitGroup

WaitGroup 为了保证 main goroutine 在所有的 goroutine 都执行完毕后再退出&#xff0c;前面使用了 time.Sleep 这种简单的方式。 由于写的 demo 都是比较简单的&#xff0c; sleep 个 1 秒&#xff0c;我们主观上认为是够用的。 但在实际开发中&#xff0c;开发人员是无法…...

React(4)

1.属性&#xff08;props&#xff09;初始 状态state都是组件内部写的&#xff0c;也就是A组件内的state就只能A组件里面用&#xff0c;其他组件复用不了。因此属性props就可以。 比如一个导航栏&#xff0c;首页有&#xff0c;购物车有&#xff0c;我的有&#xff0c;他们三个…...

STM32 CubeMX USB_(HID 鼠标和键盘)

STM32 CubeMX STM32 CubeMX USB_HID&#xff08;HID 鼠标和键盘&#xff09; STM32 CubeMX前言 《鼠标小节》一、STM32 CubeMX 设置USB时钟设置USB使能UBS功能选择 二、代码部分添加代码鼠标发送给PC的数据解析实验效果 《键盘小节》STM32 CubeMX 设置&#xff08;同上&#xf…...

[PM]敏捷开发之Scrum总结

在项目管理中&#xff0c;不少企业和项目团队也发现传统的项目管理模式已不能很好地适应今天的项目环境的要求。因此&#xff0c;敏捷项目管理应运而生&#xff0c;本文将为大家介绍Scrum敏捷项目管理以及应用方法。 什么是Scrum敏捷项目管理 敏捷项目管理作为新兴的项目管理模…...

大数据Flink(五十七):Yarn集群环境(生产推荐)

文章目录 Yarn集群环境(生产推荐) 一、准备工作...

web集群学习:源码安装nginx配置启动服务脚本

1、源码安装nginx&#xff0c;并提供服务脚本。 1、源码安装会有一些软件依赖 &#xff08;1&#xff09;检查并安装 Nginx 基础依赖包 pcre-devel 、openssl-devel # rpm -qa | egrep pcre-devel | openssl-devel&#xff08;2&#xff09;安装 Nginx 所需的 pcre 库 正则支…...

LNMP

lNmp安装&#xff1a; 一、LNMP LNMP架构是目前成熟的企业网站应用模式之一&#xff0c;指的是协同工作的一整套系统和相关软件&#xff0c; 能够提供动态Web站点服务及其应用开发环境。LNMP是一个缩写词&#xff0c;具体包括Linux操作系统、nginx网站服务器、MySQL数据库服务…...

Python网络爬虫在信息采集中的应用及教程

Python网络爬虫在信息采集中的应用与法律警告 摘要 随着互联网的发展&#xff0c;我们每天都面临着海量的信息。这些信息蕴含着无尽的价值&#xff0c;而要从中获取有用的数据&#xff0c;网络爬虫就成了我们的得力助手。Python作为一门简单而又强大的编程语言&#xff0c;被…...

云主机测试Flink磁盘满问题解决

问题描述&#xff1a; 使用云主机测试Flink时&#xff0c;根目录满了。 经排查发现运行Flink任务后根目录空间一直在减少&#xff0c;最后定位持续增加的目录是/tmp目录 解决方法&#xff1a; 修改Flink配置使用一个相对较大的磁盘目录做为Flink运行时目录 # Override the…...

iOS开发-NSOperationQueue实现上传图片队列

iOS开发-NSOperationQueue实现上传图片队列 在开发中&#xff0c;遇到发帖需要上传图片&#xff0c;需要上传队列&#xff0c;这时候用到了NSOperationQueue 一、NSOperation与NSOperationQueue 什么NSOperation NSOperation为控制任务状态、优先级、依赖关系以及任务管理提…...

通过 CCIP 构建跨链应用(5 个案例)

Chainlink 的跨链互操作性协议&#xff08;CCIP&#xff09;是一种新的通用跨链通信协议&#xff0c;为智能合约开发人员提供了以最小化信任的方式在区块链网络之间传输数据和通证的能力。 目前&#xff0c;部署在多个区块链上的应用程序面临着资产、流动性和用户的碎片化问题…...

基于 yolov8 的人体姿态评估

写在前面 工作中遇到&#xff0c;简单整理博文内容为使用预训练模型的一个预测 Demo测试图片来源与网络,如有侵权请告知理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有一个&#xff1a;找到自我。然后在心中坚守其一生&#xff0c;全心全意&#xff0c;永不停…...

计算机视觉(六)图像分类

文章目录 常见的CNNAlexnet1乘1的卷积 VGG网络Googlenet&#xff08;Inception V1、V2、V3&#xff09;全局平均池化总结 Resnet、ResnextResNet残差网络ResNeXt网络 应用案例VGGResnet 常见的CNN Alexnet DNN深度学习革命的开始 沿着窗口进行归一化。 1乘1的卷积 VGG网络…...

解决:vue通过params传参刷新页面参数丢失问题以及实现vue路由可选参数的解决办法

目录 &#x1f64b;‍♂️ 实现params传参&#xff0c;刷新页面不丢参 &#x1f64b;‍♂️ 实现vue配置可选路由参数 &#x1f64b;‍♂️ 参考资料 解决vue 通过 name 和 params 进行页面传参时&#xff0c;刷新页面参数丢失问题以及vue路由实现可选参数 &#x1f64b;‍♂…...

将postman接口导出的json转换为markdown

您可以使用 Postman 官方提供的工具或第三方工具将 Collection 文件转换为 Markdown 文件。 方式一 Postman 官方提供的工具是 Newman&#xff0c;它是一个命令行工具&#xff0c;可以帮助您运行和测试 Postman Collection&#xff0c;还可以将 Collection 转换为多种格式&am…...

教您一招解决找素材困难好的方法

创作视频内容时&#xff0c;找到合适的素材是至关重要的。然而&#xff0c;有时候寻找视频素材可能会变得困难。本文将分享一些实用的方法&#xff0c;帮助您轻松解决找视频素材困难的问题。 素材库和在线平台是寻找视频素材的首选方法。 利用专业的视频剪辑工具 在电脑上安…...

python_PyQt5开发验证K线视觉想法工具V1.2_批量验证

目录 运行情况&#xff1a; ​编辑 结果json文件格式&#xff1a; 代码&#xff1a; 承接 【python_PyQt5开发验证K线视觉想法工具V1.1 _增加标记类型_线段】 博文 地址&#xff1a;python_PyQt5开发验证K线视觉想法工具V1.1 _增加标记类型_线段_程序猿与金融与科技的博客-…...

应急响应-web后门(中间件)的排查思路

0x01 获取当前网络架构 语言&#xff0c;数据库&#xff0c;中间件&#xff0c;系统环境等 0x02 分析思路 1.利用时间节点筛选日志行为 2.利用已知的漏洞在日志进行特征搜索&#xff0c;快速定位到目标ip等信息 3.后门查杀&#xff0c;获取后门信息&#xff0c;进一步定位目…...

XML 学习笔记 7:XSD

本文章内容参考自&#xff1a; W3school XSD 教程 Extensible Markup Language (XML) 1.0 (Second Edition) XML Schema 2001 XML Schema Part 2: Datatypes Second Edition 文章目录 1、XSD 是什么2、XSD 内置数据类型 - built-in datatypes2.1、基本数据类型 19 种2.1.1、基本…...

neo4j图数据库基础操作命令(CQL语法)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…...

QQ聊天数据管理实践指南:全平台数据访问与安全操作手册

QQ聊天数据管理实践指南&#xff1a;全平台数据访问与安全操作手册 【免费下载链接】qq-win-db-key 全平台 QQ 聊天数据库解密 项目地址: https://gitcode.com/gh_mirrors/qq/qq-win-db-key 问题定位&#xff1a;聊天数据管理的核心挑战 在数字化生活中&#xff0c;即时…...

KubeSphere vs Kuboard:Kubernetes管理工具选型与实战对比

KubeSphere vs Kuboard&#xff1a;深度对比与选型指南 1. 开篇&#xff1a;为什么需要Kubernetes管理工具&#xff1f; 在云原生技术蓬勃发展的今天&#xff0c;Kubernetes已成为容器编排领域的事实标准。然而&#xff0c;原生Kubernetes Dashboard的功能相对基础&#xff0c;…...

【HTTP】HTTP协议核心体系:请求方法与状态码全结构化解析(附《思维导图》)

文章目录HTTP协议核心体系&#xff1a;请求方法与状态码全结构化解析一、核心基础概念1.1 HTTP方法的两大核心属性&#xff08;规范级定义&#xff09;1.2 HTTP状态码分类规则二、HTTP请求方法2.1 标准核心方法&#xff08;RFC 7231 定义&#xff09;2.1.1 只读类方法&#xff…...

番茄小说下载器:如何轻松搭建你的个人离线图书馆?

番茄小说下载器&#xff1a;如何轻松搭建你的个人离线图书馆&#xff1f; 【免费下载链接】Tomato-Novel-Downloader 番茄小说下载器不精简版 项目地址: https://gitcode.com/gh_mirrors/to/Tomato-Novel-Downloader 还在为网络不稳定无法畅读小说而烦恼吗&#xff1f;番…...

FFM Arena内存管理失效引发Native OOM?深度拆解Java 22 JEP 464中Scoped Memory Model的3种安全模式切换策略

第一章&#xff1a;FFM Arena内存管理失效引发Native OOM&#xff1f;深度拆解Java 22 JEP 464中Scoped Memory Model的3种安全模式切换策略Java 22 引入的 JEP 464 — Scoped Memory Model&#xff0c;旨在为 Foreign Function & Memory API&#xff08;FFM&#xff09;提…...

Zotero GPT插件全攻略:打造智能化文献管理工作流

Zotero GPT插件全攻略&#xff1a;打造智能化文献管理工作流 【免费下载链接】zotero-gpt GPT Meet Zotero. 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-gpt 学术研究中&#xff0c;文献管理往往耗费研究者大量时间与精力。Zotero GPT插件将人工智能技术与文献…...

Ostrakon-VL C++高性能集成:工业级视觉系统的核心引擎

Ostrakon-VL C高性能集成&#xff1a;工业级视觉系统的核心引擎 1. 工业视觉的极致性能挑战 在高速运转的汽车零部件生产线上&#xff0c;每分钟需要完成200次精密零件的外观检测。传统视觉方案常面临两个致命问题&#xff1a;要么漏检率超标导致质量风险&#xff0c;要么检测…...

Phi-3-mini-4k-instruct-gguf在中小企业内容运营中的应用:自动摘要与文案改写实战

Phi-3-mini-4k-instruct-gguf在中小企业内容运营中的应用&#xff1a;自动摘要与文案改写实战 1. 中小企业内容运营的痛点与机遇 对于中小企业来说&#xff0c;内容运营是品牌建设和客户沟通的重要环节。然而&#xff0c;在实际操作中&#xff0c;我们常常面临以下挑战&#…...

忍者像素绘卷效果展示:云端画布背景+金橙配色+浮雕UI真实渲染效果

忍者像素绘卷效果展示&#xff1a;云端画布背景金橙配色浮雕UI真实渲染效果 1. 视觉风格惊艳呈现 忍者像素绘卷带来了全新的视觉体验&#xff0c;将传统像素艺术与现代设计理念完美融合。这款基于Z-Image-Turbo深度优化的图像生成工具&#xff0c;创造了一个明亮通透的创作环…...

SAP-MM 公司间STO实战:从主数据到收货的完整配置与流程解析

1. 公司间STO的核心概念与业务场景 第一次接触公司间库存转储订单(STO)时&#xff0c;我误以为它和普通采购订单差不多。直到实际配置时才发现&#xff0c;这里面的门道可不少。简单来说&#xff0c;公司间STO就是集团内部不同法人公司之间的库存调拨业务&#xff0c;但会计上需…...