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

网络编程番外——IO多路复用的应用说明

一、IO多路复用与多线程

IO多路复用,IO Multiplexing,其实就是在IO上进行监听处理导致线程被阻塞(如果非阻塞就必须不断的轮询,仍然是占用此线程),如果一个IO对应一个线程是不是太浪费了。而且在诸如网络IO这种可以多达成千万的情况下使用多线程对应几乎是一场灾难。所以,可不可以提供一个技术实现在一个线程(进程)同时对多路IO进行监听处理呢?这就是IO多路复用。它的优势非常明显就是解决了线程(进程)膨胀的问题。
这就是说,IO操作是目的,多线程是实现的手段或者说方法。但线程是有上限有代价的,所以,就必须从IO处着手解决这个问题,从而提出了IO多路复用的技术。

二、同步异步与阻塞和非阻塞

说到同步异步这种老生常谈的东西其实非常理解,很多开发者或初学者总想搞清楚某个技术到底是同步还是异步。而某些框架或库在提供给外面文档上说,某某技术是异步的,但明明在书本或者其它网上看到它是同步的,就非常困惑。其实这个可以理解,很多人对框架或库的理解或者应用其实非常浅。并没有深入到其内部进行分析,有可能甚至都没有看过几行代码,都是人云亦云。
包括阻塞和非阻塞这两个概念,很多开发者一直就分不清楚他们和同步异步有什么不同。包括一些老的程序员都会在多线程和IO操作中乱叫,导致新手更是一头雾水。其实可以简单的理解成线程间处理的叫同步或异步,IO的操作称为阻塞或非阻塞。他们之间既可以单独分开使用,也可以组合一起使用。
举一个例子,epoll本身是同步的,但其上层的封装库就可以用线程实现异步的操作。epoll操作的网络句柄Socket虽然一般设置成非阻塞,但并不代表其不可以修改成阻塞。一切都是为效率和应用 。需要重点强调的,socket设置为阻塞和非阻塞并不影响epoll接口(如epoll_wait等)的操作,它影响是和其相关的Accept,Recv,Send等相关的函数接口。
因此,在真正应用一项技术前,要把其相关的接口和底层实现,基本要搞清楚,不要想当然。

三、二者的结合

其实说到这里大家应该明白得差不多了,现实世界中,哪里有什么一个单纯的方法通解决复杂的问题。正如人们吃药,大多数情况下,要吃几种药一起来控制病情。即使某种药是特效的,医生也会嘱咐病人要注意饮食,适当运动等等。这些其实都是一种组合的方式来解决问题的思路。
而在计算机的世界亦也如此。除了一些过小的或过一专项的应用,大多还是需要多种技术整合在一起解决问题。比如网络编程,不同的系统不同的平台可能提供的底层机制就有不同,比如Windows的IOCP,Linux的epoll。它们的底层本身就有不同,而上层的设计更是可以有多种形式。解决问题的思路不止一个,实现思路的手段更是多种,不要强求哪种技术是最牛的。
仍然是那句话,最合适的就是最优的。要立足实际情况,用最简单方便的手段解决问题,就是成功。

四、总结

这篇文章本来不想写的。可是,在网上经常看到有人问这个是异步还是同步,甚至有的还会因为这个互相杠。其实没有意义,是与不是,多看看源码。可能不同的版本,或者同一版本在不同的OS上,都有所不同。不必非要纠结是同步还是异步,达到目的即可。真正想明白同步异步,还是要明白适用的场景和设计的目的以及思想。不要光盯着学习资料或者书本,深入到源码中去,自然就明白了。这正是“从代码中来,到代码中去”。

相关文章:

网络编程番外——IO多路复用的应用说明

一、IO多路复用与多线程 IO多路复用,IO Multiplexing,其实就是在IO上进行监听处理导致线程被阻塞(如果非阻塞就必须不断的轮询,仍然是占用此线程),如果一个IO对应一个线程是不是太浪费了。而且在诸如网络I…...

【Java爬虫的淘宝寻宝记】—— 淘宝商品类目的“藏宝图”

引言: 在淘宝这个广袤的“商品宇宙”中,每一件商品都是一颗璀璨的星球,而商品类目就是连接这些星球的星际航道。今天,我们将派遣一位勇敢的Java爬虫宇航员,去揭开这些星际航道背后的秘密——商品类目。准备好了吗&…...

探索Python文档自动化的奥秘:揭开docxtpl库的神秘面纱

文章目录 探索Python文档自动化的奥秘:揭开docxtpl库的神秘面纱1. 背景介绍2. 库简介3. 安装指南4. 基础函数介绍5. 实际应用场景6. 常见问题及解决方案7. 总结 探索Python文档自动化的奥秘:揭开docxtpl库的神秘面纱 1. 背景介绍 在日常工作中&#xf…...

RabbitMQ的解耦、异步、削峰是什么?

RabbitMQ在分布式系统和微服务架构中起到了重要的作用,其特性可以实现解耦、异步以及削峰,下面是对这三个概念的详细解释: 1. 解耦 解耦是指使系统的不同组件间的依赖关系减少或消失。在使用RabbitMQ时,生产者(发送消…...

4:arm汇编语言4:bits/byte的介绍(ASCII码)与二进制补位

4.2 bits/byte的介绍与ASCII码的引入 这个是详细介绍计算机内部原理的基础,bits与byte其实这两个是计算机中非常重要的单位。首先看一下bits,它是一个基础的计算机单位。计算机单位?像长度单位是米,体重的单位是kg,你…...

C++实现仿安卓线程Handler、Message、Looper的功能

在java开发中,习惯使用Handler、Message来处理同步,比如对相机的操作(open、setParamters、start、stop、clost)全部抛到同一个线程处理,防止并发操作导致异常,这样保留给外部的统一接口就是安全的,无论外部哪些线程来…...

构建安全的用户登录API:从请求验证到JWT令牌生成

构建安全的用户登录API:从请求验证到JWT令牌生成 为了实现这个后端POST /api/users/login端点,我们可以使用Node.js和Express框架,并结合一些常用的库如jsonwebtoken、bcrypt和express-validator来处理验证和密码校验。下面是一个完整的示例…...

状态模式:封装对象状态并改变行为的设计模式

1. 引言 在软件开发中,某些对象的行为会随着其内部状态的变化而变化。传统的实现方式可能需要使用大量的条件语句,导致代码复杂且难以维护。状态模式(State Pattern)提供了一种有效的方法,通过将状态行为封装在状态类…...

备战“双11”丨AI+物流:你的快递会有什么变化?

背景 在中国,每天有数以亿计的包裹在运输,尤其在电商促销季如“双十一”、“618”期间,快递量更是激增。快递物流行业面临人员短缺、配送效率低下和物流承载能力有限等问题。快瞳科技提供的AI识别解决方案通过智能化手段提高工作效率和配送准…...

理解为什么要有C++设计模式

什么时设计模式? 每一个模式描述了一个在我们周围不断重复的问题以及该问题的解决方案的核心,这样,就能一次有一次地使用该方案,而不必做重复劳动。 如何解决复杂性? 分解:人们面对复杂性有一个常见的做法…...

模式匹配类型

一、匹配常量 在scala中,模式匹配可以匹配所有的字面量,包括字符串,字符,数字,布尔值等等 def describeConst(x:Any):String x match {case "str" > "匹配字符串"case > "匹配字符&…...

每天10个vue面试题(七)

1、Vue如何监听页面url中hash变化? 监听 $route 的变化:在Vue中,你可以使用watch属性来监听$route的变化。当路由发生变化时,会执行相应的处理函数。使用 window.location.hash:直接读取window.location.hash的值。这…...

如何在Linux系统中使用Apache HTTP Server

如何在Linux系统中使用Apache HTTP Server Apache简介 安装Apache 在Debian/Ubuntu系统中安装 在CentOS/RHEL系统中安装 启动Apache服务 验证Apache是否正在运行 访问Apache默认页面 配置Apache虚拟主机 创建虚拟主机配置文件 示例虚拟主机配置 创建网站根目录 准备静态网站内…...

C++基于opencv的视频质量检测--画面冻结检测

文章目录 0.引言1. 原始代码分析2. 优化方案3. 优化后的代码4. 代码详细解读 0.引言 视频质量画面冻结检测已在C基于opencv4的视频质量检测中有所介绍,本文将详细介绍其优化版本。 1. 原始代码分析 图像抖动检测的原始代码: bool ScreenFreezeDetect…...

Day22 opencv图像预处理

图像预处理 在计算机视觉和图像处理领域,图像预处理是一个重要的步骤,它能够提高后续处理(如特征提取、目标检测等)的准确性和效率。OpenCV 提供了许多图像预处理的函数和方法,常见的操作包括图像空间转换、图像大小调…...

QT中的定时器与计时器

目录 QTimer QTimer 的替代方案 API QElapsedTimer API 笔者写Qt的时候经常遇到需要定时完成任务的情况。举个例子:我写串口通信程序的时候需要定时向下位机发送数据。或者是定时任务周期性出发(更新时间等) 在Qt中,有两个非…...

国内AI大模型学习平台

据不完全统计,目前,国内有几大AI大模型学习平台可供选择: 1.昇思大模型平台:这是一个集算法选型、创意分享、模型实验和大模型在线体验于一体的AI学习与实践社区。 2.魔搭社区:提供AI模型、数据集和应用的开发与探索平…...

曹操出行借助 ApsaraMQ for Kafka Serverless 提升效率,成本节省超 20%

本文整理于 2024 年云栖大会主题演讲《云消息队列 ApsaraMQ Serverless 演进》,杭州优行科技有限公司消息中间件负责人王智洋分享 ApsaraMQ for Kafka Serverless 助力曹操出行实现成本优化和效率提升的实践经验。 曹操出行:科技驱动共享出行未来 曹操…...

深入理解数据库的三范式

数据库设计中的范式(Normal Form)是用于规范数据存储结构、消除冗余以及保证数据一致性的重要原则。范式的概念有多种层次,常用的前三种称为第一范式(1NF)、第二范式(2NF)和第三范式&#xff08…...

P11233 [CSP-S 2024] 染色

P11233 [CSP-S 2024] 染色 难度:提高/省选-。 考点:DP。 题意: 给定 n n n 个数 A i A_i Ai​,对 A i A_i Ai​ 进行染色,只有两种颜色。设 C C C 为 A A A 染色后的数组。 如果 A i A_i Ai​ 左侧没有预期同…...

不懂PMP的项目经理,正在被AI和敏捷时代淘汰

一、一个正在发生的残酷事实 张伟是一家传统制造企业的项目经理,拥有十年工作经验。他的日常工作是这样的:每天早上整理Excel进度表,中午开会协调资源,晚上更新甘特图,睡前发送项目周报。他觉得自己很忙、很重要。 直到…...

一文搞懂工业机器人通讯协议:TCP/IP、Modbus与专用协议对比

在我十年的工控开发生涯中,通讯问题永远是项目延期的第一大原因。我见过太多团队花了几个月时间做运动控制和视觉算法,最后却卡在了机器人通讯上:要么是数据传输不稳定,要么是速度跟不上产线节拍,要么是换个品牌机器人就要全部重写代码。 很多新手工程师觉得通讯就是&quo…...

ncmdump项目:网易云音乐NCM文件解密解决方案

ncmdump项目:网易云音乐NCM文件解密解决方案 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否曾经在网易云音乐下载了喜欢的歌曲,却发现只能在特定客户端播放,无法在其他设备或播放器上享受&…...

伊犁盛夏赴花海,霍城紫浪漫卷天山脚下

在新疆伊犁哈萨克自治州霍城县,天山北麓的缓坡地带铺展着国内规模最大的薰衣草种植区。每年夏季,这片土地被大面积的薰衣草覆盖,呈现出连绵的紫色景观。霍城与法国普罗旺斯、日本北海道富良野地处相近纬度,气候条件适宜薰衣草生长…...

保姆级教程:在CentOS 7上用极简包5分钟搞定openGauss数据库安装

5分钟极速部署:CentOS 7下openGauss数据库极简安装实战 当开发进度紧迫时,一个能快速搭建的数据库环境往往能挽救整个项目的时间线。本文将带您用官方极简安装包,在CentOS 7系统上5分钟内完成openGauss数据库的部署。这种方法特别适合需要立即…...

Perplexity搜索响应延迟突增2100ms?内部API调用链路拆解,开发者必看避坑清单

更多请点击: https://codechina.net 第一章:Perplexity搜索响应延迟突增2100ms?现象复现与影响定性 近期监控系统捕获到Perplexity搜索API端点( /v1/search)在UTC时间2024-06-12T08:14:22Z起出现持续约17分钟的P99延迟…...

LabVIEW项目实战:用‘类+队列’模式管理仪器参数,告别全局变量混乱

LabVIEW工程实践:基于类与队列的仪器参数管理框架设计 在工业自动化测试系统中,仪器参数管理一直是困扰工程师的典型难题。当系统需要同时控制网口、串口、GPIB等多种接口的测试设备时,传统的全局变量方案会导致参数耦合、修改不同步等问题。…...

手把手教你用AsyncOpenAI库,为自部署的Llama 3模型打造一个高速问答接口

基于AsyncOpenAI与Llama 3构建高并发问答接口的工程实践 在当今AI应用开发领域,如何将开源大模型高效地集成到生产环境中,是许多开发者面临的挑战。特别是当我们需要处理大量并发请求时,传统的同步调用方式往往成为性能瓶颈。本文将深入探讨…...

别再被0.1+0.2≠0.3搞懵了!用Python和Java代码手把手拆解IEEE-754浮点数存储

浮点数精度之谜:用代码揭开0.10.2≠0.3的真相 当你在Python控制台输入0.1 0.2时,得到的不是预期的0.3,而是0.30000000000000004。这个看似简单的数学运算为何会出现如此"诡异"的结果?本文将带你用Python和Java代码深入…...

AI一键生成微信红包封面系统源码

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍 AI微信红包封面生成器源码是一款开源的微信红包封面生成工具,由前腾讯微信后台开发工程师「idoubi」开发并开源。项目名为“AI Cover”,旨在利用人工智能技术为用…...