libevent学习——Reactor模式

news2024/11/23 10:35:58

Reactor模式

Reator的事件处理机制

Reactor翻译为“反应堆”,是一种事件驱动机制。该机制和普通函数调用的不同在于:应用程序不是主动调用某个API完成处理,相反,Reactor逆置了事件处理流程,应用程序需要提供相应的接口并注册到Reactor上,吐过相应的事件发生,Reactor将主动调用应用程序注册的接口,这些接口又被称为“回调函数(callback)”。
使用libevent也是向libevent框架注册相应的事件和回调函数,当这些事件发生时,libevent会调用这些回调函数来处理相应的事件(I/O、定时、信号)。

Reactor模式的优点

  1. 响应快,不必为单个同步事件所阻塞,虽然Reactor本身是同步
  2. 编程简单,可以最大程度地避免复杂地多线程和同步问题,并且避免了多线程/进程地切换开销
  3. 可扩展性,可以方便地通过增加Reactor实例个数来充分利用CPU资源
  4. 可复用性:Reactor框架本身与具体事件处理逻辑无关,具有较高地复用性

Reacotr模式框架

使用Reactor模型,必备地几个组件:事件源、Reactor框架、多路复用机制和事件处理程序。

  1. 事件源
    Linux上是文件描述符,Windows上就是socket或者handle,这里统一称为“句柄集”;程序在指定句柄上注册关心地事件,比如I/O事件。

  2. event demultiplexer——事件多路分发机制

由操作系统提供地I/O多路复用机制,比如select和epoll。程序首先将其关心地句柄(事件源)及其事件注册到event demultiplexer上;当有事件到达时,event demultiplexer会发出通知“在已注册地句柄集中,一个或多个句柄地事件已经就绪”;程序收到通知后,就可以在非阻塞地情况下对事件进行处理了。
对应到libevent中,依然是select、poll、epoll等,但是libevent使用结构体eventop进行了封装,以统一的接口来支持这些I/O多路复用机制,达到了对外屏蔽底层系统的目的。

  1. Reactor——反应器

Reactor,是事件管理的接口,内部使用event demultiplexer注册、注销事件,并运行事件循环;当事件进入“就绪“状态时。调用注册事件的回调函数处理事件。
对应到libevent中,就是event_base结构体。
一个典型的Reactor声明方式:

class Reactor
{
    public:
        int registerHandler(EventHandler *pHandler, int event);
        int removeHandle(EventHandler *pHandler, int event);
        void handleEvents(timeval *ptv);
        // ...
}
  1. Event Handler——事件处理程序

事件处理程序提供一组接口,每个接口对应一类事件,供Reactor在相应的事件发生时调用,执行相应的事件处理。通常它会绑定一个有效的句柄。
对应到libevent中,就是event结构体。
下面是两种典型的Event Handler类声明方式:

class EventHandler
{
    public:
        virtual void handleRead() = 0;
        virtual void handleWrite() = 0;
        virtual void handleTimeout() = 0;
        virtual void handleClose() = 0;
        virtual HANDLE getHandle() = 0;
        // ...
}

;

class EventHandler
{
    public:
        // events maybe read/write/timeout/close .etc
        virtual void handleEvents(int events) = 0;
        virtual HANDLE getHandle() = 0;
        // ...
}

Reactor 事件处理流程

在这里插入图片描述

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

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

相关文章

前后端分离毕设项目之基于springboot+vue的笔记记录分享网站设计与实现(内含源码+文档+部署教程)

博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久,选择我们就是选择放心、选择安心毕业✌ 🍅由于篇幅限制,想要获取完整文章或者源码,或者代做&am…

练习敲代码速度

2023年9月18日,周一晚上 今晚不想学习,但又不想玩游戏,于是找了一些练习敲代码的网站来玩玩,顺便练习一下敲代码的速度 目录 参考资料个人推荐第一个 第二个第三个 参考资料 电脑打字慢,有哪些比较好的练打字软件&a…

xxl-job的原理(1)

xxl-job的架构 系统组成 调度中心:进行任务统一调度,可以新增和管理执行器和任务;执行器:任务执行依赖的组件,一个执行器可以关联多个任务,添加的执行器可以自动注册到调度中心上;任务&#x…

全国职业技能大赛云计算--高职组赛题卷②(私有云)

全国职业技能大赛云计算--高职组赛题卷②(私有云) 第一场次题目:OpenStack平台部署与运维任务1 基础运维任务(5分)任务2 OpenStack搭建任务(15分)任务3 OpenStack云平台运维(15分&am…

mysq 主从同步错误之 Error_code 1032 handler error HA_ERR_KEY_NOT_FOUND

错误说明: MySQL主从同步的1032错误,一般是指要更改的数据不存在,SQL_THREAD提取的日志无法应用故报错,造成同步失败 (Update、Delete、Insert一条已经delete的数据)。 1032的错误本身对数据一致性没什么影…

VScode断点调试vue

VScode断点调试vue 1、修改launch.js文件(没有这个文件就新建)。 {// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information, visit: https://go.microsoft.com/fwlin…

ChatGLM 通俗理解大模型的各大微调方法:从LoRA、QLoRA到P-Tuning V1/V2

前言 PEFT 方法仅微调少量(额外)模型参数,同时冻结预训练 LLM 的大部分参数 第一部分 高效参数微调的发展史 1.1 Google之Adapter Tuning:嵌入在transformer里 原有参数不变 只微调新增的Adapter 谷歌的研究人员首次在论文《Parameter-Efficient Transfer Learning for N…

CSS选择器练习小游戏

请结合CSS选择器练习小游戏进行阅读(网页的动态效果是没有办法通过静态图片展示的) 网址:请点击 有些题有多种答案,本文就不一一列出了 第一题 答案:plate第二题 答案:bento第三题 答案:#fa…

前后端分离管理系统day01---Springboot+MybatisPlus

目录 目录 软件 基础知识 一创建后端项目 注意: 删除多余项 创建测试类 二 加入mybatis-plus依赖支持 1.加入依赖码 2.创建数据库实例/创建用户表/插入默认数据 创建数据库实例 创建表 插入数据 3.配置yml文件 注意:wms01必须是数据库的名字&…

JVM——8.内存分配方式

这篇文章我们来讲一下jvm的内存分配方式 目录 1.概述 1.1jvm运行时数据区 1.2堆空间的分代 1.3对象分配的整体流程 2.具体的内存分配方式 2.1指针碰撞法 2.2空闲列表法 2.3Java虚拟机选择策略 3.小结 1.概述 我们前面在GC那篇文章中写了JVM的内存分配策略&#xff0…

计算机竞赛 深度学习 opencv python 实现中国交通标志识别

文章目录 0 前言1 yolov5实现中国交通标志检测2.算法原理2.1 算法简介2.2网络架构2.3 关键代码 3 数据集处理3.1 VOC格式介绍3.2 将中国交通标志检测数据集CCTSDB数据转换成VOC数据格式3.3 手动标注数据集 4 模型训练5 实现效果5.1 视频效果 6 最后 0 前言 🔥 优质…

JWT~~

概述 回顾登录的流程: 接下来的问题是:这个出入证(令牌)里面到底存啥? 一种比较简单的办法就是直接存储用户信息的JSON串,这会造成下面的几个问题: 非浏览器环境,如何在令牌中记录…

【ABAP】一文了解如何实现ALV下拉列表编辑(附完整示例代码)

💂作者简介: THUNDER王,阿里云社区专家博主,华为云云享专家,腾讯云社区认证作者,CSDN SAP应用技术领域优质创作者。在学习工作中,我通常使用偏后端的开发语言ABAP,SQL进行任务的完成…

聚焦数据库和新兴硬件的技术合力 中科驭数受邀分享基于DPU的数据库异构加速方案

随着新型硬件成本逐渐降低,充分利用新兴硬件资源提升数据库性能是未来数据库发展的重要方向之一,SIGMOD、VLDB、CICE数据库顶会上出现越来越多新兴硬件的论文和专题。在需求侧,随着数据量暴增和实时性的要求越来越高,数据库围绕处…

【TCP】三次握手 与 四次挥手 详解

三次握手 与 四次挥手 1. 三次握手2. 四次挥手三次握手和四次挥手的区别 在正常情况下,TCP 要经过三次握手建立连接,四次挥手断开连接 1. 三次握手 服务端状态转化: [CLOSED -> LISTEN] 服务器端调用 listen 后进入 LISTEN 状态&#xff…

系统架构设计师(第二版)学习笔记----信息安全系统及信息安全技术

【原文链接】系统架构设计师(第二版)学习笔记----信息加解密技术 文章目录 一、信息安全系统的组成框架1.1 信息安全系统组成框架1.2 信息安全系统技术内容1.3 常用的基础安全设备1.4 网络安全技术内容1.5 操作系统安全内容1.6 操作系统安全机制1.7 数据…

双节履带机械臂小车实现蓝牙遥控功能

1.功能描述 本文示例所实现的功能为:采用蓝牙远程遥控双节履带机械臂小车进行运动。 2.结构说明 双节履带机械臂小车,采用履带底盘,可适用于任何复杂地形。 前节履带抬起高度不低于10cm,可用于履带车进行爬楼行进。 底盘上装有一…

三维模型3DTile格式轻量化压缩文件大小的技术方法研究

三维模型3DTile格式轻量化压缩文件大小的技术方法研究 倾斜摄影三维模型,由于数据量大、复杂度高,轻量化压缩成为其在网络传输和实时渲染中必不可少的环节。以下是几种常用的3DTile格式轻量化压缩技术方法: 几何简化:这是一种最…

Mac中IntelliJ IDEA每次打开立刻“意外退出”的解决方法

本文介绍在Mac电脑中,无法打开IntelliJ IDEA软件,出现“意外退出”的报错提示,且重启软件依然出现这一情况的通用解决思路与方法。 最近,不知道怎么回事,点击图标准备打开IntelliJ IDEA软件时,很快就会出现…

ADB底层原理

介绍 adb的全称为Android Debug Bridge,就是起到调试桥的作用。通过adb我们可以在Eclipse/Android Studio中方便通过DDMS来调试Android程序,说白了就是debug工具。adb是android sdk里的一个工具, 用这个工具可以直接操作管理android模拟器或者真实的and…