• libevent学习——Reactor模式


    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    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;
            // ...
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    ;

    class EventHandler
    {
        public:
            // events maybe read/write/timeout/close .etc
            virtual void handleEvents(int events) = 0;
            virtual HANDLE getHandle() = 0;
            // ...
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    Reactor 事件处理流程

    在这里插入图片描述

  • 相关阅读:
    【双碳】Acrel-1000DP分布式光伏并网及数据采集与控制的方式
    MySQL查询成本
    Vite知识体系
    【多线程 (一)】实现多线程的三种方式、线程休眠、线程优先级、守护线程
    代码随想录训练营第33天|休息日 小结
    【设计模式】创建者模式_工厂、抽象工厂、建造者
    ant-design-vue 实现表格表头纵排列
    跟TED演讲学英文:AI is turning into something totally new by Mustafa Suleyman
    【愚公系列】2022年08月 微信小程序-slider滑动选择器详解
    类型转换方法
  • 原文地址:https://blog.csdn.net/cclethe/article/details/133002735