作用
Reactor是一種事件處理模式,事件驅動應用程序使用Reactor架構來同步地等待一個或多個指示事件的發生,然後分離並分派一個或多個服務請求給事件處理程序中合適的鉤子(回調)方法。
通過這種方式將事件分離分派機制與服務程序中與指示相關的具體處理機制分開。
結構
Reactor由5個部分組成。
- 句柄:指用於識別網絡連接或文件打開的事件源,由操作系統提供,在linux中一般指文件描述符。
- 同步事件分離程序:一般指對一個函數(select, poll, epoll)的封裝。用於等待句柄集發生一個或多個事件。在句柄集中沒有事件發生時函數會被阻塞。
- 事件處理程序:用於指定一系列接口,代表了一系列可用操作(鉤子方法,回調)的集合,用於處理髮生於相關句柄上的事件。
- 具體事件處理程序:實現了應用程序提供的具體服務,每個具體事件處理程序與一個句柄相關聯,實現了處理對應句柄的事件的鉤子方法,這些事件通過相關聯的句柄進行接收。
- 反應器:Reactor模式的核心,用於①註冊和刪除事件處理程序即相應句柄的接口,②運行應用的事件處理循環(EventLoop),③有就緒事件到來時,分發事件到之前註冊的回調函數上處理
處理方式
- 應用啓動,將關具體事件處理程序註冊給反應器。
- 運行反應器的時間處理循環,調用同步事件分離程序,等待指示事件在句柄集發生
- 事件到來,同步事件分離程序返回到反應器
- 反應器根據就緒的句柄找到對應的事件處理程序並分派相應的鉤子方法。
- 鉤子方法調用服務。
例子
https://github.com/RaKiRaKiRa/Cyclone
本人完成的網絡庫與HttpServer 中,完整的實現了Reactor模型
其中:
反應器 :EventLoop
同步事件分離程序 : Epoller, Poller
事件處理程序 : Channel
具體事件處理程序 :Acceptor, Connection
句柄 :Socket