首页 > 其他分享 >【Reactor模型】事件驱动模型 - Reactor模型简述

【Reactor模型】事件驱动模型 - Reactor模型简述

时间:2023-07-08 20:55:57浏览次数:46  
标签:Reactor 对象 模型 事件驱动 Handler 线程 进程 多线程

Reactor模式

Reactor模式是非阻塞同步网络模式,主要由Reactor和处理资源池这两个核心部分组成,负责:

  • Reactor负责监听和分发事件,事件类型包含连接事件,读写事件;
  • 处理资源池负责处理事件,如read->处理逻辑->send

Reactor模式是灵活多变的,可以应对不同的业务场景,灵活在于:

  • Reactor的数量可以只有一个,也可以有多个;
  • 处理资源池可以是单个进程/线程,也可以是多个进程/线程

理论上有四种方案可选:

  • 单Reactor单进程/线程
  • 单Reactor多进程/线程
  • 多Reactor单进程/线程
  • 多Reactor多进程/线程

由于多Reactor单进程/线程没有性能优势,因此实际中并没有应用。剩下三个方案都比较经典,用处较多。

单Reactor单进程/线程

方案示意图:

img

可以看到进程中有Reactor、Accecptor、Handler这三个对象:

  • Reactor对象的作用是监听和分发事件
  • Acceptor对象的作用是获取连接
  • Handler对象的作用是处理业务

对象里的select,accept,read,send是系统调用函数,dispatch和业务处理是需要完成的操作,其中dispatch是分发事件操作。

单Reactor单进程方案:

  • Reactor对象通过select(IO多路复用接口)监听事件,收到事件后通过dispatch进行分发,具体分发给Acceptor对象还是Handler对象,要看事件类型;
  • 如果是连接建立事件,则交由Acceptor对象进行处理,Acceptor对象会通知accept方法获取连接,并创建一个Handler对象来处理后续响应事件。
  • 如果不是连接建立事件则交由连接对应的Handler对象来进行响应;
  • Handler对象通过read->业务处理->send来完成完整的业务流程

方案缺点:

  • 因为只有一个进程,无法充分利用多核CPU性能;
  • Handler对象在业务处理时,整个进程是无法处理其他连接收件的,如果业务处理耗时比较长,就会造成响应的延迟。

所以单Reactor单进程的方案不适用于计算机密集型的场景,只是用于业务处理非常快速的场景。Redis就是采用的此种方案。

单Reactor多进程/线程

单Reactor多进程方案示意图:

img

单Reactor多线程方案描述:

  • Reactor对象通过select(IO多路复用接口)监听事件,收到事件后通过dispatch进行分发,具体分发给Accept对象还是Handler对象,还要看收到的事件类型。
  • 如果是连接建立的事件,则交由Acceptor对象进行处理,Acceptor对象会通过accept方法获取连接,并创建一个handler对象来处理后续的响应事件
  • 如果不是连接建立事件,则交由当前连接对应的handler对象进行响应
  • Handler对象不再负责业务处理,只负责数据的接收和发送,Handler对象通过read读取到数据后,会将数据发给子线程里的Processor对象进行业务处理;
  • 子线程里的processor对象就进行业务处理,处理完成后,将结果发给主线程中的Handler对象,接着由Handler通过send方法将响应结果发送给client;

方案优势:

能够充分利用多核CPU的能力

方案缺点:

由于使用多线程,所以会带来多线程竞争资源的问题。比如:子线程在完成业余处理后,要把结果传递给主线程的Reactor进行发送,这里就涉及到共享数据的竞争。

单Reactor多进程方案:

相比多线程,多进程方案需要考虑子进程<->父进程的双向通信,并且父进程还需要知道子进程要将数据发送给哪一个客户端。因为多线程间可以共享数据,虽然要额外考虑并发问题,但是这远比进程间通信复杂度低的多。

单Reactor还存在一个问题,因为一个Reactor对象承担所有事件的监听和响应,而且只在主线程中运行,在面对瞬间高并发场景时,容易成为性能的瓶颈的地方。

多Reactor多进程/线程

多Reactor多线程方案示意图:

img

多Reactor多线程方案描述:

  • 主线程中MainReactor对象通过select监控连接建立事件,收到时间后通过Acceptor对象中的accept获取连接,将新的连接分配给某个子线程;
  • 子线程中的SubReactor对象将MainReactor对象分配到连接加入select继续进行监听,并创建一个Handler用于处理连接的响应事件
  • 如果有新的事件发生,SubReactor对象会调用当前连接对应的Handler对象来进行响应
  • Handler对象通过read->业务处理->send的流程来完成完整的业务流程。

多Reactor多线程方案相比单Reactor多线程方案实现要简单,原因如下:

  • 主线程和子线程分工明确,主线程只负责接收新链接,子线程负责完成后续的业务处理。
  • 主线程和子线程的交互很简单,主线程只需要把新连接传给子线程,子线程无需返回数据,直接就可以在子线程将处理结果发送给客户端

采用多Reactor多线程/进程方案的开源软件有Nginx












参考文章:

https://www.zhihu.com/question/26943938

标签:Reactor,对象,模型,事件驱动,Handler,线程,进程,多线程
From: https://www.cnblogs.com/Wangzx000/p/17537792.html

相关文章

  • 用 AIGC 重构后的智能客服,能否淘到大模型时代的第一桶金?
    ChatGPT的诞生打响了现代AI军备竞赛的第一枪。以GPT-4、ChatGTP、Bard等为代表的大语言模型在全球各界引起了广泛关注。结合ChatGPT的底层技术逻辑,未来中短期内ChatGPT产业化的方向大致有四类:即智能客服、文字模态的AIGC应用、代码开发相关工作以及图像生成。其中,最适......
  • Meta 正式开源音乐生成模型 MusicGen
    导读Meta近日在Github上开源了其音乐生成模型MusicGen。据介绍,MusicGen主要用于音乐生成,它可以将文本和已有的旋律转化为完整乐曲。该模型基于谷歌2017年推出的Transformer模型。研发团队表示:“我们使用了20000小时的授权音乐来对训练该模型,并采用Meta的EnC......
  • C++之内存模型
    背景C++内存模型是C++程序中内存管理和数据存储的基础。了解C++内存模型的概念和运作机制对于编写高效、安全的C++代码至关重要。本文将详细介绍C++内存模型的基本概念、内存分配策略以及与其相关的代码示例。C++内存模型的基本概念C++内存模型主要包括以下几个部分:静态存储......
  • Cesium学习笔记3——加载倾斜摄影模型
    本地的3dtiles模型采用ContextCapture19生成. 利用Cesium实验室V3.08对OSGB格式转换到3dtiles,得到的结果加载时老是报TypeError:Cannotreadpropertiesofundefined(reading'updateTransform')错误。没搞明白为啥,不过3dtiles文件夹层级目录的命名应该从以前到现在发生了......
  • R语言时间序列TAR阈值自回归模型|附代码数据
    原文链接:http://tecdat.cn/?p=5231最近我们被客户要求撰写关于时间序列TAR阈值自回归的研究报告,包括一些图形和统计输出。为了方便起见,这些模型通常简称为TAR模型这些模型捕获了线性时间序列模型无法捕获的行为,例如周期,幅度相关的频率和跳跃现象。Tong和Lim(1980)使用阈值模型表......
  • 行行AI人才直播第8期:新加坡国立大学在读博士生张傲《多模态大语言模型(MLLM)的简介及
    随着ChatGPT在各领域展现出非凡能力,多模态大型语言模型(MLLM)近来也成为了研究的热点,它利用强大的大型语言模型(LLM)作为“大脑”,可以执行各种多模态任务。更让人感慨的是,MLLM展现出了传统方法所不具备的能力,比如能够根据图像创作故事,无需OCR的数学推理等,这为实现人工智能的通用......
  • 基于MRPC的BERT模型实战
    目录1.数据处理(1)对每句话进行分词操作(2)对每句话进行编码操作2.创建模型(1)定义模型(2)构建BERT模型embedding层(3)词根据uncased_L-12_H-768_A-12预训练模型把8*128=1024个词映射成768维向量(4)加入额外编码特征(type_id)(5)加入位置编码特征3.transformer结构(1)self-attention......
  • NLP应用 | 保存checkpoint模型
    需求描述:当我们训练模型的时候,我们要训练很多训练步数,我们想要保存训练到一定阶段的checkpoint模型参数,并把这些checkpoint模型保存到一个指定的文件夹下。在文件夹下我们最多保存keep_checkpoint_max个checkpoint模型的文件。保存到output文件夹下。每save_checkpoint_steps步去......
  • 可视化模型地址
    https://github.com/zhangti0708/bigdata-exampleshttps://github.com/iGaoWei/BigDataView......
  • AI重塑千行百业,华为云发布盘古大模型3.0和昇腾AI云服务
    【中国,东莞,2023年7月7日】华为开发者大会2023(Cloud)7月7日在中国东莞正式揭开帷幕,并同时在全球10余个国家、中国30多个城市设有分会场,邀请全球开发者共聚一堂,就AI浪潮之下的产业新机会和技术新实践开展交流分享。在7日下午举行的大会主题演讲中,华为常务董事、华为云CEO张平安重磅......