reactor 和 proactor 模式的异同点

Reactor、Proactor 和协程:三大并发模型在网络编程中的异同与应用(一) 但请注意,协程是个很广泛的概念,他的应用包括但并不局限于网络I/O,而前面的reactor和proactor则是专门在网络编程领域中存在的两种模式,这也是为什么我认为协程最多算个远房亲戚的原因。笔者的上篇文章是进行协程内容的讲解,但在持续创作协程系列文章时发现,协程与Reactor、Proactor之间特别容易混淆和杂糅(笔者自己一段时间不去想,也容易搞混),因此决定中途穿插这样一篇文章,用以帮助各位网络编程初学者们(包括笔者自己)明晰三者间的异同,在学习过程中打好理论基础。 阅读详情

reactor 和 proactor 都是并发编程中的设计模式,reactor 用于同步IO,而 proactor 用于异步IO。使用reactor和proactor都可以极大的简化网络应用的开发。。接下来对这两种模式的异同点简单分析一下…..

这里写图片描述

Reactor包含如下角色:
Handle 句柄;用来标识socket连接或是打开文件;Synchronous Event Demultiplexer:同步事件多路分解器:由操作系统内核实现的一个函数;用于阻塞等待发生在句柄集合上的一个或多个事件;(如select/epoll;)Event Handler:事件处理接口Concrete Event HandlerA:实现应用程序所提供的特定事件处理逻辑;Reactor:反应器,定义一个接口,实现以下功能:
1)供应用程序注册和删除关注的事件句柄;
2)运行事件循环;
3)有就绪事件到来时,分发事件到之前注册的回调函数上处理;

“反应”器名字中”反应“的由来:
“反应”即“倒置”,“控制逆转”,具体事件处理程序不调用反应器,而是由反应器分配一个具体事件处理程序,具体事件处理程序对某个指定的事件发生做出反应;这种控制逆转又称为“好莱坞法则”(不要调用我,让我来调用你)
业务流程及时序图
这里写图片描述

应用启动,将关注的事件handle注册到Reactor中; 调用Reactor,进入无限事件循环,等待注册的事件到来; 事件到来,select返回,Reactor将事件分发到之前注册的回调函数中处理。

主动器Proactor
Proactor模式结构
这里写图片描述
Proactor主动器模式包含如下角色
Handle 句柄;用来标识socket连接或是打开文件; Asynchronous Operation Processor:异步操作处理器;负责执行异步操作,一般由操作系统内核实现; Asynchronous Operation:异步操作 Completion Event Queue:完成事件队列;异步操作完成的结果放到队列中等待后续使用 Proactor:主动器;为应用程序进程提供事件循环;从完成事件队列中取出异步操作的结果,分发调用相应的后续处理逻辑; Completion Handler:完成事件接口;一般是由回调函数组成的接口; Concrete Completion Handler:完成事件处理逻辑;实现接口定义特定的应用处理逻辑;

业务流程及时序图:
这里写图片描述

应用程序启动,调用异步操作处理器提供的异步操作接口函数,调用之后应用程序和异步操作处理就独立运行;应用程序可以调用新的异步操作,而其它操作可以并发进行; 应用程序启动Proactor主动器,进行无限的事件循环,等待完成事件到来; 异步操作处理器执行异步操作,完成后将结果放入到完成事件队列; 主动器从完成事件队列中取出结果,分发到相应的完成事件回调函数处理逻辑中;

对比两者的区别
主动和被动

以主动写为例:
Reactor将handle放到select(),等待可写就绪,然后调用write()写入数据;写完处理后续逻辑;
Proactor调用aoi_write后立刻返回,由内核负责写操作,写完后调用相应的回调函数处理后续逻辑;

可以看出,Reactor被动的等待指示事件的到来并做出反应;它有一个等待的过程,做什么都要先放入到监听事件集合中等待handler可用时再进行操作;
Proactor直接调用异步读写操作,调用完后立刻返回;
实现

Reactor实现了一个被动的事件分离和分发模型,服务等待请求事件的到来,再通过不受间断的同步处理事件,从而做出反应;

Proactor实现了一个主动的事件分离和分发模型;这种设计允许多个任务并发的执行,从而提高吞吐量;并可执行耗时长的任务(各个任务间互不影响)
优点

Reactor实现相对简单,对于耗时短的处理场景处理高效;
操作系统可以在多个事件源上等待,并且避免了多线程编程相关的性能开销和编程复杂性;
事件的串行化对应用是透明的,可以顺序的同步执行而不需要加锁;
事务分离:将与应用无关的多路分解和分配机制和与应用相关的回调函数分离开来,

Proactor性能更高,能够处理耗时长的并发场景;
缺点

Reactor处理耗时长的操作会造成事件分发的阻塞,影响到后续事件的处理;

Proactor实现逻辑复杂;依赖操作系统对异步的支持,目前实现了纯异步操作的操作系统少,实现优秀的如windows IOCP,但由于其windows系统用于服务器的局限性,目前应用范围较小;而Unix/Linux系统对纯异步的支持有限,应用事件驱动的主流还是通过select/epoll来实现;
适用场景

Reactor:同时接收多个服务请求,并且依次同步的处理它们的事件驱动程序;
Proactor:异步接收和同时处理多个服务请求的事件驱动程序;

Netty高性能之Reactor模型 服务端用于接收客户端连接的不再是1个单独的NIO线程,而是一个独立的NIO线程池。网络I/O读、写操作等由一个 NIO 线程池负责,线程池可以采用标准的 JDK 线程池实现(Netty 扩展了 JDK 线程池),它包含一个任务队列和 N 个可用的线程,由这些 NIO 线程负责消息的读取、解码、编码和发送;Acceptor 线程池只用于客户端的登录、握手和安全认证,一旦链路建立成功,就将链路注册到后端 subReactor 线程池的 I/O 线程上,有 I/O 线程负责后续的 I/O 操作。 阅读详情

相关推荐

Netty:Reactor模型

Reactor模型1.什么是Reactor(反应器设计)模式2.Reactor模式种定义的角色3.多线程IO的致命缺陷4.Reactor模型4.1 单Reactor单线程模型4.2 单Reactor多线程模型4.3 主从Reactor多线程模型 导读:在Neyyu权威指南2 ”Netty服务端创建“这一章节开头中,有这么一个前提条件,“概述是想要深入到学习Netty原理,通过阅读源码是最有效的方式之一。那么阅读源码,需要了解一定的基础是必要的。同时Reactor模式,是高性能网络编程的必知必会模式。 N

我是nlefer,想做一个有温度、有情怀的人 1797

Netty:一文搞懂Reactor模型与实现

在网络IOReactor模型和Proactor模型。Reactor基于同步IO模式,Proactor基于异步IO模式。Netty网络框架,Redis等中间件中都有使用到Reactor模型。本文将对Reactor模型的如下三种分类进行学习和实现。单Reactor单线程模型;单Reactor多线程模型;主从Reactor多线程模型。如果不具备网络IO的相关知识,建议先阅读Java网络IO模型分析与实现。Reactor模型主要就是监听事件,分发事件和处理事件。其中Reactor角色会负责监听事件和。

z1ztai的博客 1344

Netty-Reactor模型常见知识点小结

笔者分别带入索引0、5、8,进行与运算时,真正参与的二进制永远是和永远是7以内的进制,得出的结果分别是0、5、0,永远不会越界,并且运算性能还能得到保证。这样可以在进行IO操作时立即返回,不会阻塞线程,提高系统的并发性和响应性能。因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注。因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注。进行具体的事件处理。

禅与计算机程序设计的艺术 1248

Netty Reactor模型

无论是C++还是Java编写的网络框架,大多数都是基于Reactor模式进行设计和开发,Reactor模式基于事件驱动,特别适合处理海量的I/O事件。 一、Reactor三种线程模型 单线程模型 Reactor单线程模型,指的是所有的IO操作都在同一个NIO线程上面完成,NIO线程的职责如下: 1)作为NIO服务端,接收客户端的TCP连接; 2)作为NIO客户端,向服务端发起TCP连接; 3)读取通信对端的请求或者应答消息; 4)向通信对端发送消息请求或者应答消息。 Reactor单线程模型示意

cristianoxm的博客 974

【R语言实例】物种分布模型介绍

SDM介绍

wong2016的博客 1万+

Python | KS检验以及其余非参数检验的实现

Python | KS检验以及其余非参数检验的实现1 什么是KS检验2 KS检验分类?3 KS检验的Python实现3.1 检验指定的数列是否服从正态分布3.2 检验指定的两个数列是否服从相同分布4 其余的非参数检验4.1 Wilcoxon符号秩检验(t检验的非参数版本)4.2 Kruskal-Wallis H检验(方差分析的非参数版本)4.3 Mann-Whitney秩检验5 参考 1 什么是KS检验 定义:检验一个分布f(x)与理论分布g(x)【比如正态分布】是否一致,或两个观测值分布是否有显著差异的检

RUC_Lee的博客 1万+

Reactor和Proactor对比以及优缺点(netty的底层原理reactor模型)

IO设计模式:Reactor和Proactor对比 平时接触的开源产品如Redis、ACE,事件模型都使用的Reactor模式;而同样做事件处理的Proactor,由于操作系统的原因,相关的开源产品也少;这里学习下其模型结构,重点对比下两者的异同点; 反应器Reactor Reactor模式结构 Reactor包含如下角色: Handle 句柄;用来标识socket连

七月流星 7699

Windows 11任务管理器隐藏技能:一眼揪出内存泄漏的“元凶”(分页/非分页缓冲池详解)

本文详细介绍了Windows 11任务管理器中隐藏的分页缓冲池和非分页缓冲池功能,帮助用户精准定位内存泄漏问题。通过启用隐藏列、解读数据异常信号,并结合实战案例和高级工具推荐,为开发者和IT运维人员提供了高效的内存问题诊断与解决方案。

weixin_29284885的博客 623

IO设计模式:Reactor和Proactor对比

平时接触的开源产品如Redis、ACE,事件模型都使用的Reactor模式;而同样做事件处理的Proactor,由于操作系统的原因,相关的开源产品也少;这里学习下其模型结构,重点对比下两者的异同点; 反应器Reactor Reactor模式结构 Reactor包含如下角色: Handle 句柄;用来标识socket连接或是打开文件; Synchronous Event Demultiplex...

xupeng1644的博客 1198

深入理解搜索引擎——搜索评价指标

    搜索引擎,在做好query理解、索引召回以及排序模型之后,就能直接推上线了吗?答案是否定的,还需对其性能和质量进行评测。性能无非是对时间和空间的运行效率作评测,不细讲,今天讲讲搜索引擎的质量评测。通过质量评测,可根据评测结果不断的进行改进和研究,也可以验证搜索引擎在真实环境中运行时的实际效果。因此,搜索引擎的质量评测对于整个系统的研制和发展是至关重要的。     那么有哪些指标可以评估搜索引擎的结果质量呢?最广为人知的

我是药老的博客 4485

Unity3d SECTR 2019 从零开始了解(零)

插件刚下载下来,虽然从Demo里面看了下大致效果,但尝试使用的时候茫无头绪,因此决定一边读文档一边写下笔记。这个笔记会从最基本的名词概述开始一步一步到用法。 除非特别注明,所有内容都不是机翻,而是理解后自己翻译的。 翻译内容: 【零】API REFERENCE MANUAL第一章Documentation Core Concept 【一】 名词概述 CORE CORE是SECTR的核心,一个快速将 Sectors 和 Portals 加入到Unity中的工具,以及完整的源代码,可以构筑独特的功能。 VI

狗蛋在土里瑟瑟发抖 1500

Reactor和Proactor网络编程模型

链接:https://www.zhihu.com/question/26943938/answer/68773398 reactor:能收了你跟俺说一声。 proactor:你给我收十个字节,收好了跟俺说一声。 1、标准定义 两种I/O多路复用模式:Reactor和Proactor 一般地,I/O多路复用机制都依赖于一个事件多路分离器(Event Demultiplexer)。分离器对象...

Likes的博客 337

探索gtwr of mgtwr in python

代码】探索gtwr of GWmodel in python。

m0_46268055的博客 3388

java proactor_IO设计模式:Reactor和Proactor对比

平时接触的开源产品如Redis、ACE,事件模型都使用的Reactor模式;而同样做事件处理的Proactor,由于操作系统的原因,相关的开源产品也少;这里学习下其模型结构,重点对比下两者的异同点;反应器ReactorReactor模式结构Reactor包含如下角色:Handle 句柄;用来标识socket连接或是打开文件;Synchronous Event Demultiplexer:同步事件多...

weixin_39823459的博客 118

NVIDIA Isaac Sim 联合 VS Code 开发调试环境配置

在 Visual Studio Code (VS Code) 中打开 Isaac Sim 软件包主文件夹,即可打开该工作区。注意建议在学习教程和示例时使用 Visual Studio Code。另请参见有关 VS Code 工作区的详细信息,请参阅 Visual Studio Code (VS Code) 文档。

2506_90492529的博客 3103

YOLOv11 | 一文带你深入理解ultralytics最新作品yolov11的创新 | 训练、推理、验证、导出 (附网络结构图)

ultralytics发布了最新的作品YOLOv11,这一次YOLOv11的变化相对于ultralytics公司的上一代作品YOLOv8变化还是很大的(YOLOv9、YOLOv10均不是ultralytics公司作品),其中改变的位置涉及到C2f变为C3K2,在SPPF后面加了一层类似于注意力机制的C2PSA,还有一个变化大家从yaml文件是看不出来的就是它的检测头内部替换了两个DWConv,在损失函数方面就没有变化了还是采用的CIoU作为边界框回归损失,下面带大家深入理解一下ultralytics最新作品

Snu77的博客 18万+

Reactor与proActor异同

<br />Reactor与proActor异同<br /><br />Reactor与ProActor都是并发设计模式中的设计模式。在我们看来,都是处理派发/分离操作IO事件的。派发/分离事件就是将单独的IO事件通知到上层模块。不同之处是,Preactor用于异步,Reactor用于同步。<br /><br />可以看出,两个模式的相同点,都是对某个IO事件的事件通知(即告诉某个模块,这个IO操作可以进行或已经完成)。在结构<br />上,两者也有相同点:demultiplexor负责提交IO操作(异步)

damoyuyuam的专栏 697

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

I/O模型之三:两种高性能 I/O 设计模式 Reactor 和 Proactor

平时接触的开源产品如Redis、ACE,事件模型都使用的Reactor模式;而同样做事件处理的Proactor,由于操作系统的原因,相关的开源产品也少;这里学习下其模型结构,重点对比下两者的异同点;Reactor 和 Proactor 是基于事件驱动,在网络编程中经常用到两种设计模式。 说到异步IO,其实现在很难实现真正的异步,大部分情况下仍然需要阻塞在某个多路复用函数,比如select 或者 epoll 上,得到就绪描述符,然后调用注册在相应描述符上的回调函数。这种方式是现在的反应堆设计的基本思路。我截

weixin_42073629的博客 414

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Proactor和Reactor模式

 Proactor和Reactor都是并发编程中的设计模式。在我看来,他们都是用于派发/分离IO操作事件的。这里所谓的IO事件也就是诸如read/write的IO操作。"派发/分离"就是将单独的IO事件通知到上层模块。两个模式不同的地方在于,Proactor用于异步IO,而Reactor用于同步IO。 摘抄一些关键的东西: "Two patterns that involve even

技术收藏 1627

深入分析 Java I/O (九)线程/进程模型Reactor和Proactor

一、标准定义 二、通俗理解 三、Reactor模式结构 四、Proactor模式结构 五、两者的区别 一、标准定义 两种I/O多路复用模式:Reactor和Proactor,一般地I/O多路复用机制都依赖于一个事件多路分离器(Event Demultiplexer)。分离器对象可将来自事件源的I/O事件分离出来,并分发到对应的read/write事件处理器(Event Hand...

keep_trying的专栏 578

设计模式之reactor、proactor

看了很多说的不明不白,有的还和语言有关。 reactor、proactor他们同为派发/分离IO事件,而reactor为同步,proactor为异步。 什么意思呢?我们在编写网络程序的时候很想把网络数据和网络通信本身分离,这样可以很好的调试和分块。 1.典型的reactor模式为当数据来时,通知用户读 2.典型的proactor表现为数据到达时,为上面把数据存好后(当然可以是用户自定义的缓

TANG_XIAO_BIN的专栏 1613

Proactor模型

前言 上一篇讲解的Reaactor是非阻塞的同步网络模式,而Proactor是异步网络模式。 至于异步IO怎么理解:可以参考我的这一篇博客: Linux的五种IO模型 理解之后:你就会感受到:很明显,异步 I/O 比同步 I/O 性能更好,因为异步 I/O 在「内核数据准备好」和「数据从内核空间拷贝到用户空间」这两个过程都不用等待。 因此: Reactor 可以理解为「来了事件操作系统通知应用进程,让应用进程来处理」 Proactor 可以理解为「来了事件操作系统来处理,处理完再通知应用进程」。这里的「

qq_44824574的博客 1933
上一篇: 领导者-追随者 模式
下一篇: 句柄与指针的区别
lm_123_456
博客等级 码龄11年 35粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值