Go并发编程之四

news2024/12/23 12:14:23

一、前言

今天我们介绍一下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.coloradmin.cn/o/1120459.html

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

相关文章

组合数(递推版)的初始化

初始考虑为将第一列数和斜对角线上的数进行初始化。 橙色方块由两个绿色方块相加而来,一个为1,一个为0,所以斜对角线都为1,可以通过计算得来,不需要初始化,需要与码蹄集盒子与球 第二类Stirling数&#xf…

【Linux】命令行参数和环境变量

命令行参数 其实main函数是可以传参数的,也叫做命令行参数。我们这里先介绍main函数的前两个参数 argc代表的是指针数组的元素个数,argv是一个指针数组,指针指向字符串。argv不可能为空,argv【0】存储该进程的名字 例如 ls -a -…

【数据结构】830+848真题易错题汇总(10-23)

【数据结构】830848易错题汇总(10-23) 文章目录 【数据结构】830848易错题汇总(10-23)选择题填空题判断题简答题:应用题:算法填空题:算法设计题:(待补) 选择题 1、顺序栈 S 的 Pop(S, e)操作弹出元素 e,则下列(C )是正…

在 Python 中使用 Pillow 进行图像处理【2/4】

第二部分 一、说明 该文是《在 Python 中使用 Pillow 进行图像处理》的第二部分,主要介绍pil库进行一般性处理:如:图像卷积、钝化、锐化、阈值分割。 二、在 Python 中使用 Pillow 进行图像处理 您已经学习了如何裁剪和旋转图像、调整图像大…

Yakit工具篇:专项漏洞检测的配置和使用

简介(来自官方文档) 专项漏洞检测是针对特定应用程序或系统进行的安全漏洞扫描技术,旨在检测与该应用程序或系统相关的安全漏洞。 Yakit通过对常见的中间件、CMS、框架、组件进行总结、归纳,并针对这些组件对其常见的高危漏洞进…

027-第三代软件开发_ComboBox

第三代软件开发_ComboBox 文章目录 第三代软件开发_ComboBox项目介绍ComboBox实际使用 关键字: Qt、 Qml、 ComboBox、 delegate、 Connections 项目介绍 欢迎来到我们的 QML & C 项目!这个项目结合了 QML(Qt Meta-Object Language&…

试题一 (软件设计师笔记)(15分)

😀前言 现在就是总复习试题一 🏠个人主页:尘觉主页 🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉 在csdn获奖荣誉: 🏆csd…

记录打包部署Springboot项目到Windows环境

Springboot项目开发完成后要做的工作就是部署了,这里记录下打包部署的过程。这个项目是一个SpringBoot多模块项目,包含了一个父工程,一个子模块和一个工具模块。其中子模块里有启动类,而工具模块没有。因此这三者的pom文件不一样。…

SOME/IP, DDS 还是 MQTT

如今,用户希望将他们的汽车根据个人偏好进行定制,通过添加功能并定期进行更新,就像他们对待移动设备一样。实现这些期望属性的一个构建模块是基于 Internet Protocol(IP)的通信;IP为新的设计模式打开了大门…

arcgis js api 4.x加载geoserver发布的地方坐标系(自定义坐标系)的wms服务

问题描述:之前研究过arcgis js api 4.x加载arcgis server 发布的地方坐标系的wms服务,后来研究出来能正常加载了,想了解的可以看我之前的博客。但是一直困于加载geoserver发布的地方坐标系的wms服务,一直都是用的WMSLayer这个调用…

1024渗透OpenVas扫描工具使用(第十四课)

1024渗透扫描工具使用(第十四课) 一 漏洞披露 1 微软安全更新指南(自2017年2月起,替代安全公告) 安全公告都有一个惟一的编号 其命名规则是:MS年份-补丁序号 或 CVE-年份-补丁序号 比如MS17-010就表示2017年发布的编号为010的安…

自然语言处理---Transformer构建语言模型

语言模型概述 以一个符合语言规律的序列为输入,模型将利用序列间关系等特征,输出一个在所有词汇上的概率分布,这样的模型称为语言模型。 # 语言模型的训练语料一般来自于文章,对应的源文本和目标文本形如: src1 "I can do&…

【剑指Offer】34.二叉树中和为某一值的路径(二)

题目 输入一颗二叉树的根节点root和一个整数expectNumber,找出二叉树中结点值的和为expectNumber的所有路径。 1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点 2.叶子节点是指没有子节点的节点 3.路径只能从父节点到子节点,不能从…

运维:mysql常用的服务器状态命令

目录 1、查询当前服务器运行的进程 2、查询最大链接数 3、查询当前链接数 4、展示当前正在执行的sql语句 5、查询当前MySQL当中记录的慢查询条数 6、展示Mysql服务器从启动到现在持续运行的时间 7、查询数据库存储占用情况 8、查询服务器启动以来的执行查询的总次数 9…

算法通关村第十关黄金挑战——归并排序详解

大家好,我是怒码少年小码。 归并排序 就是将一个大的序列分为多个小的序列,对小的序列排序,最后利用归并的思想合并序列。归并排序的思想就是分而治之。 分:将大序列分为很多个小的序列 治:将多个小的序列合并为大序…

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

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

解决 Element-ui中 表格(Table)使用 v-if 条件控制列显隐时数据展示错乱的问题

本文 Element-ui 版本 2.x 问题 在 el-table-column 上需根据不同 v-if 条件来控制列显隐时&#xff0c;就会出现列数据展示错乱的情况&#xff08;要么 A 列的数据显示在 B 列上&#xff0c;或者后端返回有数据的但是显示的为空&#xff09;&#xff0c;如下所示。 <tem…

Python教程(15)——Python流程控制语句详解

目录 if语句else if语句for循环遍历类型range关键字 while循环break语句continue语句 Python流程控制是Python编程中非常重要的一部分&#xff0c;它用于控制程序的执行流程。Python提供了多种流程控制语句&#xff0c;包括if语句、while循环、for循环、break和continue语句等。…

[翻译]理解Postgres的IOPS:为什么数据即使都在内存,IOPS也非常重要

理解Postgres的IOPS&#xff1a;为什么数据即使都在内存&#xff0c;IOPS也非常重要 磁盘IOPS&#xff08;每秒输入/输出操作数&#xff09;是衡量磁盘系统性能的关键指标。代表每秒可以执行的读写操作数量。对于严重依赖于磁盘访问的PG来说&#xff0c;了解和优化磁盘IOPS对实…

使用QT实现http里面的get和post

#1024程序员节&#xff5c;参与投稿&#xff0c;赢限定勋章和专属大奖# #假如你有一台服务器&#xff0c;你最想做哪些事&#xff1f;# #你被什么样的BUG困扰过一周以上&#xff1f;# 在http里面下面这些方法和服务器的响应代码一起用于HTTP协议中的请求和响应交互。请注意&…