作用
Reactor是一种事件处理模式,事件驱动应用程序使用Reactor架构来同步地等待一个或多个指示事件的发生,然后分离并分派一个或多个服务请求给事件处理程序中合适的钩子(回调)方法。
通过这种方式将事件分离分派机制与服务程序中与指示相关的具体处理机制分开。
结构
Reactor由5个部分组成。
- 句柄:指用于识别网络连接或文件打开的事件源,由操作系统提供,在linux中一般指文件描述符。
- 同步事件分离程序:一般指对一个函数(select, poll, epoll)的封装。用于等待句柄集发生一个或多个事件。在句柄集中没有事件发生时函数会被阻塞。
- 事件处理程序:用于指定一系列接口,代表了一系列可用操作(钩子方法,回调)的集合,用于处理发生于相关句柄上的事件。
- 具体事件处理程序:实现了应用程序提供的具体服务,每个具体事件处理程序与一个句柄相关联,实现了处理对应句柄的事件的钩子方法,这些事件通过相关联的句柄进行接收。
- 反应器:Reactor模式的核心,用于①注册和删除事件处理程序即相应句柄的接口,②运行应用的事件处理循环(EventLoop),③有就绪事件到来时,分发事件到之前注册的回调函数上处理
处理方式
- 应用启动,将关具体事件处理程序注册给反应器。
- 运行反应器的时间处理循环,调用同步事件分离程序,等待指示事件在句柄集发生
- 事件到来,同步事件分离程序返回到反应器
- 反应器根据就绪的句柄找到对应的事件处理程序并分派相应的钩子方法。
- 钩子方法调用服务。
例子
https://github.com/RaKiRaKiRa/Cyclone
本人完成的网络库与HttpServer 中,完整的实现了Reactor模型
其中:
反应器 :EventLoop
同步事件分离程序 : Epoller, Poller
事件处理程序 : Channel
具体事件处理程序 :Acceptor, Connection
句柄 :Socket