平時接觸的開源產品如redis、ace,事件模型都使用的reactor模式;而同樣做事件處理的proactor,由於作業系統的原因,相關的開源產品也少;這裡學習下其模型結構,重點對比下兩者的異同點;
reactor模式結構
reactor包含如下角色:
「反應」器名字中」反應「的由來:
「反應」即「倒置」,「控制逆轉」,具體事件處理程式不呼叫反應器,而是由反應器分配乙個具體事件處理程式,具體事件處理程式對某個指定的事件發生做出反應;這種控制逆轉又稱為「好萊塢法則」(不要呼叫我,讓我來呼叫你)
業務流程及時序圖
應用啟動,將關注的事件handle註冊到reactor中;
呼叫reactor,進入無限事件迴圈,等待註冊的事件到來;
事件到來,select返回,reactor將事件分發到之前註冊的**函式中處理;
proactor模式結構
proactor主動器模式包含如下角色
業務流程及時序圖
應用程式啟動,呼叫非同步操作處理器提供的非同步操作介面函式,呼叫之後應用程式和非同步操作處理就獨立執行;應用程式可以呼叫新的非同步操作,而其它操作可以併發進行;
應用程式啟動proactor主動器,進行無限的事件迴圈,等待完成事件到來;
非同步操作處理器執行非同步操作,完成後將結果放入到完成事件佇列;
主動器從完成事件佇列中取出結果,分發到相應的完成事件**函式處理邏輯中;
主動和被動
以主動寫為例:
reactor將handle放到select(),等待可寫就緒,然後呼叫write()寫入資料;寫完處理後續邏輯;
proactor呼叫aoi_write後立刻返回,由核心負責寫操作,寫完後呼叫相應的**函式處理後續邏輯;
可以看出,reactor被動的等待指示事件的到來並做出反應;它有乙個等待的過程,做什麼都要先放入到監聽事件集合中等待handler可用時再進行操作;
proactor直接呼叫非同步讀寫操作,呼叫完後立刻返回;
實現reactor實現了乙個被動的事件分離和分發模型,服務等待請求事件的到來,再通過不受間斷的同步處理事件,從而做出反應;
proactor實現了乙個主動的事件分離和分發模型;這種設計允許多個任務併發的執行,從而提高吞吐量;並可執行耗時長的任務(各個任務間互不影響)
優點reactor實現相對簡單,對於耗時短的處理場景處理高效;
作業系統可以在多個事件源上等待,並且避免了多執行緒程式設計相關的效能開銷和程式設計複雜性;
事件的序列化對應用是透明的,可以順序的同步執行而不需要加鎖;
proactor效能更高,能夠處理耗時長的併發場景;
缺點reactor處理耗時長的操作會造成事件分發的阻塞,影響到後續事件的處理;
proactor實現邏輯複雜;依賴作業系統對非同步的支援,目前實現了純非同步操作的作業系統少,實現優秀的如windows iocp,但由於其windows系統用於伺服器的侷限性,目前應用範圍較小;而unix/linux系統對純非同步的支援有限,應用事件驅動的主流還是通過select/epoll來實現;
適用場景
reactor:同時接收多個服務請求,並且依次同步的處理它們的事件驅動程式;
proactor:非同步接收和同時處理多個服務請求的事件驅動程式;
IO設計模式 Reactor和Proactor對比
平時接觸的開源產品如redis ace,事件模型都使用的reactor模式 而同樣做事件處理的proactor,由於作業系統的原因,相關的開源產品也少 這裡學習下其模型結構,重點對比下兩者的異同點 reactor包含如下角色 反應 器名字中 反應 的由來 反應 即 倒置 控制逆轉 具體事件處理程式不...
reactor設計模式
reactor設計模式,是一種基於事件驅動的設計模式。pattern oriented software architecture,volume 2 對這個模式做了詳細的講解。這個模式的結構圖如下 圖中的handle對應的是作業系統提供的控制代碼,例如i o控制代碼,event handler類持有...
設計模式 reactor
先看個段子吧,更好理解 reactor這個詞譯成漢語還真沒有什麼合適的,很多地方叫反應器模式,但更多好像就直接叫reactor模式了,其實我覺著叫應答者模式更好理解一些。通過了解,這個模式更像乙個侍衛,一直在等待你的召喚,或者叫召喚獸。併發系統常使用reactor模式,代替常用的多執行緒的處理方式,...