1.模式介紹react
在普通的事件處理機制:首先程序調用某個函數,而後函數執行,程序等待,當函數執行完畢後函數將結果和控制權返回給程序,最後程序繼續處理。函數
Reactor模式的事件處理方式:咱們能夠將整個問題抽象。每一個須要處理的事件就是一個事件源,每個須要處理的事件接收到數據後的進一步處理操做做爲一個事件處理器。咱們將須要被處理的事件處理源及其事件處理器註冊到一個相似於epoll的事件分離器中。事件分離器負責等待事件發生。一旦某個事件發送,事件分離器就將該事件傳遞給該事件註冊的對應的處理器,最後由處理器負責完成事件的具體響應。操作系統
在Reactor模式中,應用程序不是主動的調用某個API完成處理,而是逆置了事件處理流程,應用程序須要提供相應的事件接口並註冊到Reactor上,若是相應的事件發生,Reactor將主動調用應用程序註冊的接口,經過註冊的接口完成具體的事件處理。線程
2.模式組成接口
Reactor模式由事件源、事件反應器、事件分離器、事件處理器等組件組成。事件
事件源(handle):由操做系統提供,用於識別每個事件,如Socket描述符、文件描述符等。在服務端系統中用一個整數表示。該事件可能來自外部,如來自客戶端的鏈接請求、數據等。也可能來自內部,如定時器事件。
事件反應器(reactor):定義和應用程序控制事件調度,以及應用程序註冊、刪除事件處理器和相關描述符相關的接口。它是事件處理器的調度核心,使用事件分離器來等待事件的發生。一旦事件發生,反應器先是分離每一個事件,而後調度具體事件的事件處理器中的回調函數處理事件。
事件分離器(demultiplexer):是一個有操做系統提供的I/O複用函數,在此咱們選用epoll。用來等待一個或多個事件的發生。調用者將會被阻塞,直到分離器分離的描述符集上有事件發生。
事件處理器(even handler):事件處理程序提供了一組接口,每一個接口對應了一種類型的事件,供reactor在相應的事件發生時調用,執行相應的事件處理。通常每一個具體的事件處理器老是會綁定一個有效的描述符句柄,用來識別事件和服務。ip
3.處理流程回調函數
分爲兩個部分,事件註冊部分和事件分發部分 ;it
在事件註冊部分,應用程序首先將期待註冊的套接字描述符做爲事件源,並將描述符和該事件對應的事件處理回調函數封裝到具體的事件處理器中,並將該事件處理器註冊到事件反應器中。事件反應器接收到事件後,進行相應處理,並將註冊信息再次註冊到事件分離器epoll中。最後在epoll分離器中,經過epoll_ctl進行添加描述符及其事件,並層層返回註冊結果。定時器
在事件處理部分,首先事件反應器經過調用事件分離器的epoll_wait,使線程阻塞等待註冊事件發生。此時若是某註冊事件發生,epoll_wait將會返回,並將包含該註冊事件在內的事件集返回給事件反應器。反應器接收到該事件後,根據該事件源找到該事件的事件處理器,並判斷事件類型,根據事件類型在該事件處理器調用以前註冊時封裝的具體回調函數,在這個具體回調函數中完成事件處理。