您的位置:首页 > Web前端 > React

libevent源码学习-----Reactor模型

2017-10-10 22:16 387 查看
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 源码