Go并发编程之四

一、前言

今天我们介绍一下Go并发编程另外一个重要概念【多路复用】,多路复用最开始是在网络通讯领域(硬件)应用,指的是用同一条线路承载多路信号进行通信的方式,有频分多路复用、时分多路复用等等技术,然后扩展到操作系统软件层面,HTTP2协议为什么这么快,关键一点就是用了多路复用技术,关于HTTP2多路复用可以看  HTTP2入门、 HTTP2多路复用原理以及gRPC抓包分析 这两篇文章。

二、Go并发为何要用多路复用

我们用一个例子来说明要用多路复用原因,程序中创建了三个goroutine分别执行三个不同任务,花费时间分别是10毫秒、1毫秒、2毫秒,然后任务执行完后获取任务的输出结果。

执行结果如下:

可以看到整个执行花费了10秒多,这样写的代码是有问题的,我第2个任务其实只需要1秒钟,但这个代码从ch1通道获取数据,因为oneRoutine任务执行时间很长,会造成ch1通道阻塞,而ch1通道阻塞,整个主goroutine就阻塞了,ch2和ch3这两个通道有数据但被ch1给阻塞了,要解决这个问题就要用到多路复用select了。

三、加上多路复用代码

我们更改一下上面的程序,三个任务函数oneRoutine、twoRoutine、threeRoutine不变,在从通道获取数据时加上select代码。

执行结果

这样ch2和ch3通道有数据就能立即返回而不会受到ch1通道阻塞的影响。

注:select会及时响应每一个就绪的channel,另外还可以用select 来处理超时的情况,当通道一直没有数据就绪超过3秒钟,就执行另外一条case避免程序一直等待。

注:在Unix网络编程中其实也有讲到I/O复用模型select poll函数,概念和Go中也差不多。这是本经典书,很多年以前看过几页,也只看了几页。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/114059.shtml

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

相关文章

MySQL日志 错误日志 二进制日志 查询日志 慢查询日志

一、错误日志 错误日志是MySQL中最重要的日志之一,它记录了当mysqld启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时,建议首先查看此日志。 该日志是默认开启的,默认存放目录/var/log/,默认的日志文件名…

小程序路由传参的方法?

小程序路由传参的方法有两种: 1.通过URL参数传递:可以在跳转页面时在URL中携带参数,目标页面可以通过获取URL参数来使用。使用wx.navigateTo或wx.redirectTo方法进行页面跳转,并在URL中添加参数。 示例代码如下: // …

2019年亚太杯APMCM数学建模大赛A题基于图像分析的二氧化硅熔化表示模型求解全过程文档及程序

2019年亚太杯APMCM数学建模大赛 A题 基于图像分析的二氧化硅熔化表示模型 原题再现 铁尾矿的主要成分是二氧化硅,而二氧化硅是铁尾矿成分中最难熔化的部分。因此,铁尾矿的熔融行为可以用二氧化硅的熔融行为来表示。然而,高温熔池的温度超过…

Android FloatingActionButton 使用神坑记录

1.FloatingActionButton 死活都不是圆形 必须加上下面这个属性才是圆形 app:shapeAppearance"style/ShapeAppearanceOverlay.Material3.Button"2.FloatingActionButton 中间的icon不居中 加上下面的属性,然后大小跟你的控件大小一致 app:fabCustomSiz…

C语言标准规范版本介绍

0 Preface/Foreword ANSI:American National Standards Institute,美国国家标准协会 ISO:International Organization for Standardization,国际标准组织 IEC:International Electrotechnical Commission&#xff0…

Jmeter的性能测试

性能测试的概念 定义:软件的性能是软件的一种非功能特性,它关注的不是软件是否能够完成特定的功能,而是在完成该功能时展示出来的及时性。 由定义可知性能关注的是软件的非功能特性,所以一般来说性能测试介入的时机是在功能测试…

Python---练习:while循环嵌套(用两次while三步走--里外各一次)

1、循环嵌套的引入 案例: 有天女朋友又生气了,惩罚:说3遍“老婆大人, 我错了”,这个程序是不是循环即可?但如果女朋友说:还要刷今天晚饭的碗,这个程序怎么书写? 思考&…

面试题 01.06. 字符串压缩

​​题目来源: leetcode题目,网址:面试题 01.06. 字符串压缩 - 力扣(LeetCode) 解题思路: 计算压缩后的字符串长度,如果该长度小于原字符串长度,返回压缩后的字符串,否则…

MOSFET(五):DrMos

一、简介 DrMos(Driver MOSFET)技术是 Intel 于2004年推出的服务器主板节能技术,即把 2 个MOSFET和 1 个MOS驱动器 三合一,集成在一个封装中。集成后的 DrMos 面积是分离MOSFET的 ,功率密度是其 倍,通过搭…

Flink中的时间和窗口操作

1.窗口概念 在大多数场景下,我们需要统计的数据流都是无界的,因此我们无法等待整个数据流终止后才进行统计。通常情况下,我们只需要对某个时间范围或者数量范围内的数据进行统计分析:如每隔五分钟统计一次过去一小时内所有商品的点击量;或者每发生1000次点击后,都去统计一…

android 13/14高版本SurfaceFlinger出现VSYNC-app/VSYNC-appSf/VSYNC-sf剖析

问题背景: 了解surfaceflinger的vsync同学都可能知道vsync属于一个节拍器,主要用来控制有节奏的渲染,不至于会产生什么画面撕裂等现象。 一般vsync都有会有2部分: app部分vsync,控制各个app可以有节奏的上帧 surfacef…

UVM-什么是UVM方法学

概念简介 百度对UVM的解释如下: 通用验证方法学(Universal Verification Methodology, UVM)是一个以SystemVerilog类库为主体的验证平台开发框架,验证工程师可以利用其可重用组件构建具有标准化层次结构和接口的功能验证环境 UVM…

GIT 分支管理办法

GIT 分支管理办法 一. 大型项目分支管理中存在的痛点 大型项目中需求的上线存在很大的不确定性,而且往往存在多版本、多团队、多开发并行的情况。尤其是大型企业对上线分支中编号的管理十分严苛,严禁夹带上线。这时对于开发而言,没有一个好…

ubuntu18.04服务器双网口配置上外网

记录一下配置服务器过程,本以为简单,结果整了一天。 服务器有2个网口,网口2是用来上外网的,原来用的01-netcfg.yaml进行ip地址设置,主要就用2条命令: vi /etc/netplan/01-netcfg.yaml (打开后…

UE4 AI群集实现

逻辑就不用说了,就是计算对应图形位置让每个Pawn移动到该位置 因为有时候AI与AI会卡住 所以加上这个Bool为true,以及设置两个AI之间至少隔的距离,设置在一个合理的参数即可 有时候AI群集,AI与AI会比较紧密,可以将Caps…

初始 c++(1)

目录: 目录 1: 命名空间的详解 2:c的输入与输出关键字及理解 3:详细讲解第一个c程序(每段代码的意思) 4:缺省参数的理解 5:函数重载 引言:从今天开始我们就开始学习c了,让我们一起开始新的知识吧! 1:命名空间 所谓的命名空间…

分类预测 | MATLAB实现SSA-CNN-LSTM-Attention数据分类预测(SE注意力机制)

分类预测 | MATLAB实现SSA-CNN-LSTM-Attention数据分类预测(SE注意力机制) 目录 分类预测 | MATLAB实现SSA-CNN-LSTM-Attention数据分类预测(SE注意力机制)分类效果基本描述模型描述程序设计参考资料 分类效果 基本描述 1.MATLAB实…

【MySQL】视图、函数、存储过程优缺点

文章目录 1. 概述2. 视图2.1 优点2.2 缺点 3. 存储过程与存储函数3.1 优点3.2 缺点 1. 概述 因为视图、函数、存储过程的使用一般具有使用少或具备争议的特点,所以该章主要记录对应的优缺点,需要使用时需结合业务谨慎评估是否使用 2. 视图 一个或者多…

Tomcat设置IP黑名单和白名单server.xml

方式一&#xff1a; -- 只允许192.168.1.2和192.168.2.3 <Context path"" docBase"xxxAdmin" debug"0" reloadable"true" ><Valve className"org.apache.catalina.valves.RemoteAddrValve" allow"192.168.1.…

用 pytorch 训练端对端验证码识别神经网络并进行 C++ 移植

文章目录 前言安装安装 pytorch安装 libtorch安装 opencv&#xff08;C&#xff09; 准备数据集获取训练数据下载标定 编码预分析 数据集封装格式 神经网络搭建神经网络训练神经网络测试神经网络预测C 移植模型转换通过跟踪转换为 Torch Script通过注解转换为 Torch Script 编写…