libevent源码学习-----Reactor模型
libevent内部采用了reactor模型
所谓reactor模型,其实就是一套事件注册机制,用来解决单线程的阻塞问题。reactor核心思想是将事件和相应事件发生时想要调用的函数都记录下来,在事件驱动循环开始后进行统一监测,当某个事件发生,会直接调用相应事件的处理函数。
比如说有事件event1,event2,event3。相应事件发生时想要调用的回调函数是cb1,cb2,cb3。然而如果是顺序判断每个事件的发生时,会是这样
阻塞等待event1发生
执行cb1
阻塞等待event2发生
执行cb2
阻塞等待event3发生
执行cb3
然而如果在等待event1发生时event2发生了,因为此时event1仍然没有发生,所以会阻塞在等待event1的位置,导致event2发生了却没有调用event2的回调函数
reactor正是解决这种问题的模型,先将event1和cb1,event2和cb2,event3和cb3注册到事件驱动上,reactor负责以非阻塞的方式等待注册事件的发生,当某(些)个事件发生时,reactor主动调用相应的回调函数
注册event1和cb1到reactor中
注册event2和cb2到reactor中
注册event3和cb3到reactor中reactor以阻塞的方式判断有什么事件发生,比如调用io复用函数
对检测到发生的事件调用对应的回调函数
与Reactor相对应的有一个Proactor模型,它才是真正意义上的异步,而Reactor只能称为同步
二者不同之处在于
- Reactor需要由应用程序本身调用回调函数,在这个时候仅仅是一个一个回调函数的调用,即同步调用,如果某个回调函数执行时间过长,会影响后面的函数调用
- Proactor不需要应用程序调用,而是交给内核执行回调函数,当内核执行完后将结果返回给应用程序,所以不会出现Reactor的问题
libevent源码学习-----Reactor模型相关推荐
- Opencascade源码学习之模型算法_TKO模块文件介绍
Opencascade源码学习之模型数据_TKO模块文件介绍 1.TKO 1.BOPAlgo 2.BOPDS 3.BOPTools 4.BRepAlgoAPI 5.IntTools 1.TKO 1.B ...
- fasttext源码学习(2)--模型压缩
fasttext源码学习(2)–模型压缩 前言 fasttext模型压缩的很明显,精度却降低不多,其网站上提供的语种识别模型,压缩前后的对比就是例证,压缩前126M,压缩后917K.太震惊了,必须学习 ...
- Opencascade源码学习之模型数据
Opencascade源码学习之模型数据 1.模型数据 2.几何工具 1.插值和拟合 1.分析一组点 2.基本插值和近似 3.2D 插值 4.3D 插值 5.2D 拟合 6.3D 拟合 7.曲面拟合 ...
- Opencascade源码学习之模型数据——TKGeomBase模块文件介绍
Opencascade源码学习之模型数据--TKGeomBase模块文件介绍 1.AdvApp2Var 2.AppCont 3.AppDef 4.AppParCurves 5.Approx 6.Bnd ...
- libevent源码学习-----阅读心得
框架设计思路 libevent使用统一事件源将所有问题都转化为event,比如将套接字/信号/描述符都在内部转化为event,由相应的io多路复用函数进行监控. 为了提供对超时event的支持,lib ...
- libevent源码学习-----event操作
libevent核心结构是event_base和event,接下来主要介绍event结构 /* event的定义的主要部分 */ struct event {/* ... *//* event监听的描 ...
- libevent源码学习-----event_base事件循环
event_base是libevent的事件驱动,也是Reactor模式的直接体现.任何使用libevent的代码最开始都需要创建一个base,之后的任何接口函数都和这个base关联着,下面是stru ...
- libevent源码学习-----时间管理
libevent监听的event有以下几种 文件描述符/套接字,没有设定超时时长 信号 文件描述符/套接字,设定超时时长 对于时间,libevent内部的时间管理是通过最小堆实现的,原因如下 既然某些 ...
- libevent源码学习----io多路复用的封装和使用
因为是非阻塞监听事件的发生,所以内部其实还是采用io多路复用函数实现的. 又因为可供选择的io函数很多,linux下有epoll, poll, select等,window下有ICOP, select ...
最新文章
- 破解ERP的使用成本之谜
- CS294-112 深度强化学习 秋季学期(伯克利)NO.3 Reinforcement learning introduction
- 南方人物周刊:智能手机割据战
- Apache Beam欲通过uber api获取大数据
- 降雨插值_ArcGIS计算土壤侵蚀模数(二)降雨侵蚀力因子R计算
- 怎么查linux上谁删了文件,如何在 Linux 下快速找到被删除的文件?
- java面试要点---基础部分CoreJava,基础及语法
- golang 之 import 和 package 的使用
- Node.js 系列翻译---console
- string和System.String
- Python基础篇1
- USB转串口线突然不好用了
- html表格行数代码,HTML表格可选行Javascript包
- Siamese-RPN论文阅读
- 二十一世纪大学英语读写教程学习笔记(原文)——2 - Conversational Ballgames(对话风格与球类运动)
- Windows下通过远程桌面连接向远程电脑传输文件
- Linux如何使用find命令将查找出来的文件删除或者复制到另一个位置?
- 计算机软件ae常用英语,AE英文插件该怎么翻译?
- 揭开木马的神秘面纱 2
- linux 共享内存 出错,共享内存的std :: string给出了分段错误(linux)
热门文章
- Java黑皮书课后题第5章:**5.38(十进制转八进制)编写程序,提示用户输入一个十进制整数,然后显示对应的八进制值。(不要是使用Java的Integer类的任何方法)
- cropper.js 图像旋转问题_快速提高前端开发效率:10个JavaScript图像处理库
- 圆桌的项目Alpha冲刺——测试
- linux下查看十六进制文件方法
- 分布式监控系统Zabbix3.2添加自动发现磁盘IO并注册监控
- “天昌”的挽歌——逝去的背影(一)
- 学术与技术(与队长交流偶得)
- SpringBoot整合Mybatis完整详细版
- python学习手册
- 【数据结构与算法】之深入解析“基本计算器”的求解思路与算法示例