libevent源码学习-----Reactor模型
2017-10-10 22:16
387 查看
libevent内部采用了reactor模型
所谓reactor模型,其实就是一套事件注册机制,用来解决单线程的阻塞问题。reactor核心思想是将事件和相应事件发生时想要调用的函数都记录下来,在事件驱动循环开始后进行统一监测,当某个事件发生,会直接调用相应事件的处理函数。
比如说有事件event1,event2,event3。相应事件发生时想要调用的回调函数是cb1,cb2,cb3。然而如果是顺序判断每个事件的发生时,会是这样
然而如果在等待event1发生时event2发生了,因为此时event1仍然没有发生,所以会阻塞在等待event1的位置,导致event2发生了却没有调用event2的回调函数
reactor正是解决这种问题的模型,先将event1和cb1,event2和cb2,event3和cb3注册到事件驱动上,reactor负责以非阻塞的方式等待注册事件的发生,当某(些)个事件发生时,reactor主动调用相应的回调函数
与Reactor相对应的有一个Proactor模型,它才是真正意义上的异步,而Reactor只能称为同步
二者不同之处在于
Reactor需要由应用程序本身调用回调函数,在这个时候仅仅是一个一个回调函数的调用,即同步调用,如果某个回调函数执行时间过长,会影响后面的函数调用
Proactor不需要应用程序调用,而是交给内核执行回调函数,当内核执行完后将结果返回给应用程序,所以不会出现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源码学习笔记一:event2/event.h
- libevent学习之四:VS2012编译libevent-2.1.8-stable源码 可调试
- 【libevent】源码学习(一)--开篇
- 【libevent】源码学习(5)--bufferevent详解
- cocos2D-X源码分析之从cocos2D-X学习OpenGL(20)----模型,网格和材质
- Cassandra源码学习:数据模型
- libevent源码学习-----event操作
- ATL源码学习---线程模型支持
- libevent2.0源码学习三:对网络模型的(EPOLL)的封装
- libevent源码深度剖析:Reactor模式
- libevent 源码学习笔记
- [原创+转载] memcached源码学习-多线程模型
- Libevent学习---evconnlistener使用和源码分析
- libevent源码学习-----统一事件源及信号绑定函数
- libevent高性能网络库源码分析——Reactor模式(二)
- libevent2.0源码学习三:对网络模型的(EPOLL)的封装
- Libevent源码分析-----跨平台Reactor接口的实现
- Netty学习之旅------再谈线程模型之源码分析NioEventLoopGroup、SingleThreadEventExecutor
- Libevent源码分析-----跨平台Reactor接口的实现
- LDA主题模型学习笔记5:C源码理解