首页 > 其他分享 >Reactor并发模型

Reactor并发模型

时间:2024-04-20 20:23:09浏览次数:13  
标签:事件处理 函数 模型 并发 事件 注册 event Reactor

1. Reactor模式

Reactor为“反应堆”,是一种事件驱动机制。Reactor逆置了事件处理流程,应用程序需要提供相应的接口并注册到Reactor上,如果相应的时间发生,Reactor将主动调用应用程序注册的接口,这些接口称为“回调函数”。

普通的函数处理机制为:调用某函数-> 函数执行, 主程序等待阻塞-> 函数将结果返回给主程序-> 主程序继续执行。

Reactor事件处理机制为:主程序将事件以及对应事件处理的方法在Reactor上进行注册, 如果相应的事件发生,Reactor将会主动调用事件注册的接口,即 回调函数. libevent即为封装了epoll并注册相应的事件(I/O读写,时间事件,信号事件)以及回调函数,实现的事件驱动的框架。

Reactor事件处理机制的编程模型,在Redis中也得到了很好的运用,Redis中基于I/O多路复用(mutiplexing) 开发Reactor事件处理机制,监听多个套接字的AE_READABLE读,AE_WRITABLE写事件。读事件绑定读操作和具体执行命令的操作函数,写事件绑定命令回复的操作函数。

2. Reactor架构

Reactor架构模式允许事件驱动的应用通过多路分发的机制去处理来自不同客户端的多个请求。

Reactor核心的事件处理流程,有如下几个关键组件:

事件(事件源)
linux上为文件描述符,handler即为注册在特定事件上的程序,事件发生通常在linux下为I/O事件,由操作系统触发。

Reactor(反应器)
事件管理的接口,内部使用event demultiplexer注册,注销事件;并运行事件循环,当有事件进入"就绪"状态时,调用注册事件的回调函数处理事件。

class Reactor {
public:
    int register_handler(EventHandler *pHandler, int event);

    int remove_handler(EventHandler *pHandler, int event);

    void handle_events(timeval *ptv);
}

Event demultiplexer(事件多路分发机制)
由操作系统提供的I/O多路复用的机制,例如select, epoll. 程序首先将handler(事件源)以及对应的事件注册到event demultiplexer上;当有事件到达时,event demultiplexer就会发出通知,通知Reactor调用事件处理程序进行处理。

Event Handler(事件处理程序)
事件处理程序提供了一组接口,在Reactor相应的事件发生时调用,执行相应的事件处理,通常会绑定一个有效的handler

class Event_Handler {
public:
    // events maybe read/write/timeout/close .etc
    virtual void handle_events(int events) = 0;

    virtual HANDLE get_handle() = 0;
}

传统线程池 vx. 事件驱动模型

对于传统的线程池模型来说只能每个对于每个请求使用一个单独的线程去处理,这就导致了当请求增加时过多了线程上下文切换,出现了性能上的瓶颈。

事件驱动的模型如下图,充分的利用linux select epoll模型,并注册相应的回调函数对于不同的事件,根据I/O多路复用的机制,实现了高并发,和高可扩展性。

标签:事件处理,函数,模型,并发,事件,注册,event,Reactor
From: https://www.cnblogs.com/AccompanyingLight/p/18148101

相关文章

  • 更改ollama模型存储路径
    默认情况下,ollama模型的存储目录如下:macOS:~/.ollama/modelsLinux:/usr/share/ollama/.ollama/modelsWindows:C:\Users\<username>\.ollama\models如果需要使用不同的目录,则需设置环境变量OLLAMA_MODELS,把它设置为所选目录。https://github.com/ollama/ollama/blob/ma......
  • Go语言高并发与微服务实战专题精讲——远程过程调用 RPC——服务端注册实现原理分析
    远程过程调用RPC——服务端注册实现原理分析rpcserver代码参考我前一篇博文:https://www.cnblogs.com/zuoyang/p/18146870RPCServer端的RPC代码架构主要由两大部分构成:第一部分是服务方法的注册过程。在这个过程中,我们首先通过调用rpc.Register接口将服......
  • 深度解读《深度探索C++对象模型》之数据成员的存取效率分析(一)
    接下来我将持续更新“深度解读《深度探索C++对象模型》”系列,敬请期待,欢迎关注!也可以关注公众号:iShare爱分享,自动获得推文和全部的文章列表。在《深度解读《深度探索C++对象模型》之C++对象的内存布局》这篇文章中已经详细分析过C++的对象在经过封装后,在各种情况下的内存布局以......
  • 短视频直播系统,实现高并发秒杀的多种方式
    方式一(改进版加锁)@ApiOperation(value="秒杀实现方式——Lock加锁")@PostMapping("/start/lock")publicResultstartLock(longskgId){//在此处加锁lock.lock();try{log.info("开始秒杀方式一...");finallonguserId=(int)(ne......
  • 利用预测不确定性提高安卓恶意软件检测模型性能
    文献简介文献标题:MalCertainEnhancingDeepNeuralNetworkBasedAndroidMalwareDetectionbyTacklingPredictionUncertainty引用:Yang,Liminetal."BODMAS:AnOpenDatasetforLearningbasedTemporalAnalysisofPEMalware",IEEESymposiumonSecurity......
  • Go语言高并发与微服务实战专题精讲——远程过程调用 RPC——实践案例:Go 语言 RPC 过程
    远程过程调用RPC——实践案例:Go语言RPC过程调用实践 Go语言的官方RPC库/net/rpc为开发者提供了实现远程过程调用的强大功能,使得通过网络访问对象的方法成为可能。这种机制极大地促进了分布式系统的构建,让不同的服务能够轻松地进行相互通信和协作。 在使用Go的RPC库时,服务......
  • 大模型+电力预测?或是泡沫
    自ChatGPT问世以后,大模型非常的火,不出意外的话,电力系统方向又打算搞事情了(灌水)。大模型+电力任重道远。最近听说了一些关于大模型+风光功率预测、负荷预测、电价预测的想法,初步分析下,个人得出结论是不可行。简单来说,如果强行使用大模型来做电力预测,本质上可能只是一厢情愿的希望大......
  • Go语言高并发与微服务实战专题精讲——远程过程调用 RPC
    远程过程调用RPC 在微服务架构中,每个服务实例负责某一单一领域的业务实现,不同服务实例之间需要进行频繁的交互来共同实现业务。服务之间通过轻量级的远程调用方式进行通信。比如说RPC和HTTP。两者虽然同为微服务实例之间远程调用的方式,但是HTTP调用是应用层协议,而RPC的......
  • 【机器学习】第二节-如何选择和评估模型
    目录一、经验误差与过拟合错误率精度误差训练误差/经验误差度量指标泛化误差欠拟合过拟合二、评估方法专家样本1.留出法(1)单次留出法(2)多次留出法2.交叉验证(1)k折交叉验证(2)留一法(3)P次k折交叉验证3.自助法三、性能度量四、偏差与方差一、经验误差与过拟合错误率分类错误样......
  • 高并发(阻塞队列)
    阻塞队列是一种常用的并发编程工具,它能够在多线程环境下提供一种安全而高效的数据传输机制阻塞队列是一种特殊的队列,它具有以下几个特点:1、阻塞特性:当队列为空时,从队列中获取元素的操作将会被阻塞,直到队列中有新的元素被添加;当队列已满时,向队列中添加元素的操作将会被阻塞,直到队......