標籤:reactor io 並發
好萊塢原則是“不要打電話給我們,我們會打電話通知你”,其實Reactor模式就是如此,你不必一直詢問某個事件是否發生了,當事件發生時,會主動通知你。一般用於伺服器並發的處理請求。先來看幾個Reactor模式中的參與者。
- 事件處理器:對應一個描述符,實現了應用程式在該描述符上提供的服務。
- Reactor管理器:是事件處理器的調度核心。用於控制事件調度,以及應用程式註冊、刪除事件處理器和相關的描述符。Reactor管理器使用同步事件分離器來等待事件的發生。
- 同步事件分離器(demultiplexer):用來等待一個或多個事件的發生,調用者會被阻塞,直到分離器分離的描述符集上有事件發生。如Linux中的select,就是一個分離器。
應用程式要做的,僅僅是實現一個事件處理器,然後把它註冊到Reactor管理器中,接下來的事件調度工作就交由管理器來完成。Reactor管理器肩負著事件的分離和調度,是整個架構設計的核心。設想一個多使用者並發訪問的例子,來體驗一下Reactor的作用。現在餐廳同時到了五組客人,傳統的線程池做法是,為每組客人(請求)分配一個服務員(線程)。Reactor的做法是,服務員Tom先去招呼A組客人,讓A組客人慢慢看菜譜點菜,然後再去招呼B組,依次下去,當A組點好了菜,會直接招呼服務員"點好了",這時Tom再去招呼A組客人,為A組客人錄入菜單。這樣會大大提高餐廳的效率,節省人力。如果這是一台伺服器在並發處理客戶請求,一請求一線程,看似合理,卻要消耗很多系統資源。但如果這些客戶請求並不要求伺服器一直處理,也就是有I/O事件(伺服器在接受用戶端A請求後,通過它們之間的socket開始讀A發送的資料),這時相應的伺服器線程就可以抽身去處理其他請求,但完成A的讀取後會通知伺服器繼續處理用戶端A的請求。這就需要一套庫來協助伺服器程式完成這些調度,伺服器程式只需提供當請求來臨,I/O事件發生時的處理函數即可,那些如何為並發請求訪問分配線程和線程調度,以及何時調用伺服器程式準備的處理函數的問題都交由那套庫來處理。總之,Reactor就是當I/O事件發生時會主動通知你,你就不必一直守著直到該事件發生,還是抽身去多幹點其他的事吧。
I/O併發模式—Reactor模式