深入浅出Reactor和Proactor模式

news2024/11/20 15:49:39

        Reactor模式Proactor模式是两种常见的设计模式,用于处理事件驱动的并发编程。它们在处理IO操作时有着不同的工作方式和特点。

对于到来的IO事件(或是其他的信号/定时事件),又有两种事件处理模式

  • Reactor模式:要求主线程(I/O处理单元)只负责监听文件描述符上是否有事件发生(可读、可写),若有,则立即通知工作线程,将socket可读可写事件放入请求队列,读写数据、接受新连接及处理客户请求均在工作线程中完成。(需要区别读和写事件)
  • Proactor模式:主线程和内核负责处理读写数据、接受新连接等I/O操作工作线程仅负责业务逻辑(给予相应的返回url),如处理客户请求

Reactor模式:

工作方式:Reactor模式使用一个事件循环/事件轮询器(通常是主线程),负责监听和分发IO事件。当有IO事件发生时,Reactor会调用相应的处理函数进行处理。
优点:

  • 简单且易于理解和实现。通常只需要一个事件循环器以及事件处理函数即可实现。
  • 可以处理大量的并发连接,因为使用一个线程来处理所有的IO事件,减少了线程切换的开销。

缺点:

  • 对于处理耗时的IO操作阻塞,会导致整个Reactor的处理能力下降,无法充分利用CPU资源。
  • 无法利用多核处理器的优势,因为只有一个线程用于处理IO事件。

Proactor模式:

工作方式:Proactor模式使用多线程来处理IO事件。一个线程负责发起IO操作,当操作完成后,另一个线程会收到通知并处理完成的IO操作。

(图借鉴网络)
优点:

  • 可以充分利用多核处理器的优势来处理并发IO操作。
  • 每个线程可以同时处理多个IO事件。
  • 高效利用CPU资源,即使有部分IO操作阻塞也不会影响其他线程的正常工作。

缺点:

  • 实现较复杂,涉及多线程之间的同步和通信,需要额外的开销。
  • 每个IO操作都需要启动两个线程,可能会导致系统开销较大。

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

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

相关文章

阿里云服务器“镜像”操作系统选择方法(超详细)

阿里云服务器镜像怎么选择?云服务器操作系统镜像分为Linux和Windows两大类,Linux可以选择Alibaba Cloud Linux,Windows可以选择Windows Server 2022数据中心版64位中文版,阿里云服务器网aliyunfuwuqi.com来详细说下阿里云服务器操…

CAN总线位时序

一. 简介 前面文章学习了 CAN总线协议,即五种数据帧格式。 I.MX6ULL 带有 CAN 控制器外设,叫做 FlexCAN,FlexCAN 符合 CAN2.0B 协议。 本文来学习一下 CAN总线的位时序。 二. CAN总线位时序 CAN 总线以帧的形式发送数据,但是…

Teable——强大的在线数据电子表格

公众号:【可乐前端】,每天3分钟学习一个优秀的开源项目,分享web面试与实战知识,也有全栈交流学习摸鱼群,期待您的关注! 每天3分钟开源 hi,这里是每天3分钟开源,很高兴又跟大家见面了&#xff0…

C++ Thread 源码 观后 自我感悟 整理

Thread的主要数据成员为_Thr 里面存储的是线程句柄和线程ID 先看看赋值运算符的移动构造 最开始判断线程的ID是否不为0 _STD就是使用std的域 如果线程ID不为0,那么就抛出异常 这里_New_val使用了完美转发,交换_Val和_New_val的值 _Thr _STD exchange(_…

BRAM底层原理详细解释(1)

目录 一、原语 二、端口简述 2.1 端口简介 2.2 SDP端口映射 三、端口信号含义补充说明 3.1 字节写使能(Byte-Write Enable)- WEA and WEBWE: 3.2 地址总线—ADDRARDADDR and ADDRBWRADDR 3.3 数据总线—DIADI, DIPADIP, DIBDI, and D…

Pycharm小妙招之Anaconda离线配环境

Pycharm小妙招之Anaconda离线配环境———如何给无法联网的电脑配python环境? 1. 预备工作2. 电脑1导出包2.1 环境路径2.2 压缩py38导出至U盘 3. 电脑2导入包4. 验证是否导入成功4.1 conda查看是否导入4.2 pycharm查看能否使用 1. 预备工作 WINDOWS系统电脑1(在线)…

AI跟踪报道第34期-新加坡内哥谈技术-AI新闻快报:世界即将改变

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

手撕算法-买卖股票的最佳时机(买卖一次)

描述 分析 只能买卖一次。希望在最低处买,最高处卖。 怎么判断最低处?遍历时存储已遍历的最小值。 怎么判断最高处?遍历时,比较当前位置和最小值的差,取较大的。 代码 class Solution {public int maxProfit(int…

HCIP实验02

实验步骤 1、R1和R2使用ppp链路之连,R2和R3把2条ppp链路捆绑为ppp直连 [R2]int Mp-group 0/0/0 [R2]int Serial 3/0/1 [R2-Serial3/0/1]ppp mp Mp-group 0/0/0 [R2-Serial3/0/1]int Serial 4/0/0 [R2-Serial4/0/0]ppp mp Mp-group 0/0/0 [R3]int Mp-group 0/0/…

基于Java中的SSM框架实现矿场仓储管理系统项目【项目源码+论文说明】

基于Java中的SSM框架实现矿场仓储管理系统演示 摘要 随着数字化的建设,根据当时的发展和用户的需求,选择使用矿产资源管理的信息都是可以用作示范。物质生活已经达到了人们的基本要求,人们追求生活层次越来越高,享受生活成为人们…

python内置装饰器

python内置装饰器 内置装饰器 不用实例化、直接调用提升代码的可读性 内置装饰器:classmethod类方法、staticmethod静态方法 普通方法 定义:第一个参数为self,代表 实例本身调用:要有实例化的过程,通过 实例对象.方法名 调用 …

JavaSE——数据类型与变量

1. 数据类型 在 Java 中数据类型主要分为两类: 基本数据类型 和 引用数据类型 。 基本数据类型有 四类八种 : 1. 四类:整型、浮点型、字符型以及布尔型 2. 八种: 数据类型关键字内存占用范围字节型byte1 个字节-128~127短整型…

「渗透笔记」致远OA A8 status.jsp 信息泄露POC批量验证

前言部分 在本节中,我会分两部分来说明致远OA A8 status.jsp 信息泄露的验证问题,其实就是两种验证方式吧,都一样,都是批量验证,主要如下所示: 通过Python脚本进行批量验证,但是前提是你可以收…

rider下ef core迁移

新建数据库 create database mockstu新建web项目 安装Microsoft.EntityFrameworkCore.SqlServer包 设置连接字符串 新建model using MockStuWeb.Models.EnumTypes; using System.ComponentModel.DataAnnotations;namespace MockStuWeb.Models {/// <summary>/// 学生…

Redis实战篇-1

实战篇Redis 开篇导读 短信登录 这一块我们会使用redis共享session来实现 商户查询缓存 通过本章节&#xff0c;我们会理解缓存击穿&#xff0c;缓存穿透&#xff0c;缓存雪崩等问题&#xff0c;让小伙伴的对于这些概念的理解不仅仅是停留在概念上&#xff0c;更是能在代码…

vs2019新建Qt工程中双击 .ui 文件无法打开

vs2019 中创建的 Qt 工程&#xff0c;在使用的过程中&#xff0c;经常会有&#xff1a;双击 .ui 文件&#xff0c;闪退的情况&#xff0c;也即 .ui 文件无法打开&#xff01; 针对该问题的详细解决步骤如下&#xff1a; 1、右击该 .ui 文件&#xff0c;选择“打开方式” 2、…

思通舆情 是一款开源免费的舆情系统 介绍

思通舆情 是一款开源免费的舆情系统。 支持本地化部署&#xff0c;支持在线体验。 支持对海量舆情数据分析和挖掘。 无论你是使用者还是共同完善的开发者&#xff0c;欢迎 pull request 或者 留言对我们提出建议。 您的支持和参与就是我们坚持开源的动力&#xff01;请 sta…

【数据结构基础】之八大排序(C语言实现)

【数据结构基础】之八大排序(C语言实现&#xff09; &#x1f427; 冒泡排序♈️ 冒泡排序原理及代码实现♈️ 稳定性分析 &#x1f427; 选择排序♈️ 选择排序原理及代码实现♈️ 稳定性分析 &#x1f427; 插入排序♈️ 插入排序的原理及代码实现♈️ 稳定性分析 &#x1f4…

【数据结构】猛猛干7道链表OJ

前言知识点 链表的调试技巧 int main() {struct ListNode* n1(struct ListNode*)malloc(sizeof(struct ListNode));assert(n1);struct ListNode* n2(struct ListNode*)malloc(sizeof(struct ListNode));assert(n2);struct ListNode* n3(struct ListNode*)malloc(sizeof(struc…

GAMMA数据处理问题(七)

phase_sim_orb报这个错是什么原因呢&#xff0c;说是我的hgt文件和模拟的干涉图行数不匹配&#xff0c;之前geocode生成hgt的参数不是在mli.par文件中看吗&#xff0c;为什么会出现行数不匹配的情况啊&#xff0c;难道不是par文件中里面看&#xff1f;&#xff1f;&#xff1f;…