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模型相关推荐

  1. Opencascade源码学习之模型算法_TKO模块文件介绍

    Opencascade源码学习之模型数据_TKO模块文件介绍 1.TKO 1.BOPAlgo 2.BOPDS 3.BOPTools 4.BRepAlgoAPI 5.IntTools 1.TKO 1.B ...

  2. fasttext源码学习(2)--模型压缩

    fasttext源码学习(2)–模型压缩 前言 fasttext模型压缩的很明显,精度却降低不多,其网站上提供的语种识别模型,压缩前后的对比就是例证,压缩前126M,压缩后917K.太震惊了,必须学习 ...

  3. Opencascade源码学习之模型数据

    Opencascade源码学习之模型数据 1.模型数据 2.几何工具 1.插值和拟合 1.分析一组点 2.基本插值和近似 3.2D 插值 4.3D 插值 5.2D 拟合 6.3D 拟合 7.曲面拟合 ...

  4. Opencascade源码学习之模型数据——TKGeomBase模块文件介绍

    Opencascade源码学习之模型数据--TKGeomBase模块文件介绍 1.AdvApp2Var 2.AppCont 3.AppDef 4.AppParCurves 5.Approx 6.Bnd ...

  5. libevent源码学习-----阅读心得

    框架设计思路 libevent使用统一事件源将所有问题都转化为event,比如将套接字/信号/描述符都在内部转化为event,由相应的io多路复用函数进行监控. 为了提供对超时event的支持,lib ...

  6. libevent源码学习-----event操作

    libevent核心结构是event_base和event,接下来主要介绍event结构 /* event的定义的主要部分 */ struct event {/* ... *//* event监听的描 ...

  7. libevent源码学习-----event_base事件循环

    event_base是libevent的事件驱动,也是Reactor模式的直接体现.任何使用libevent的代码最开始都需要创建一个base,之后的任何接口函数都和这个base关联着,下面是stru ...

  8. libevent源码学习-----时间管理

    libevent监听的event有以下几种 文件描述符/套接字,没有设定超时时长 信号 文件描述符/套接字,设定超时时长 对于时间,libevent内部的时间管理是通过最小堆实现的,原因如下 既然某些 ...

  9. libevent源码学习----io多路复用的封装和使用

    因为是非阻塞监听事件的发生,所以内部其实还是采用io多路复用函数实现的. 又因为可供选择的io函数很多,linux下有epoll, poll, select等,window下有ICOP, select ...

最新文章

  1. 破解ERP的使用成本之谜
  2. CS294-112 深度强化学习 秋季学期(伯克利)NO.3 Reinforcement learning introduction
  3. 南方人物周刊:智能手机割据战
  4. Apache Beam欲通过uber api获取大数据
  5. 降雨插值_ArcGIS计算土壤侵蚀模数(二)降雨侵蚀力因子R计算
  6. 怎么查linux上谁删了文件,如何在 Linux 下快速找到被删除的文件?
  7. java面试要点---基础部分CoreJava,基础及语法
  8. golang 之 import 和 package 的使用
  9. Node.js 系列翻译---console
  10. string和System.String
  11. Python基础篇1
  12. USB转串口线突然不好用了
  13. html表格行数代码,HTML表格可选行Javascript包
  14. Siamese-RPN论文阅读
  15. 二十一世纪大学英语读写教程学习笔记(原文)——2 - Conversational Ballgames(对话风格与球类运动)
  16. Windows下通过远程桌面连接向远程电脑传输文件
  17. Linux如何使用find命令将查找出来的文件删除或者复制到另一个位置?
  18. 计算机软件ae常用英语,AE英文插件该怎么翻译?
  19. 揭开木马的神秘面纱 2
  20. linux 共享内存 出错,共享内存的std :: string给出了分段错误(linux)

热门文章

  1. Java黑皮书课后题第5章:**5.38(十进制转八进制)编写程序,提示用户输入一个十进制整数,然后显示对应的八进制值。(不要是使用Java的Integer类的任何方法)
  2. cropper.js 图像旋转问题_快速提高前端开发效率:10个JavaScript图像处理库
  3. 圆桌的项目Alpha冲刺——测试
  4. linux下查看十六进制文件方法
  5. 分布式监控系统Zabbix3.2添加自动发现磁盘IO并注册监控
  6. “天昌”的挽歌——逝去的背影(一)
  7. 学术与技术(与队长交流偶得)
  8. SpringBoot整合Mybatis完整详细版
  9. python学习手册
  10. 【数据结构与算法】之深入解析“基本计算器”的求解思路与算法示例