Reactor具體分為三種線程模型
- 單Reactor單線程
- 單Reactor多線程
- 主從Reactor多線程
單Reactor單線程
在單線程模型中Reactor和Acceptor,以及執行任務的線程都在一個線程,當線程在執行耗時的業務處理時,這時的鏈=連接請求或者其他的業務不能及時的處理,當請求並發量比較低的時候還是可以抗住的,一旦高並發,將不堪重負,而且單線程也沒有充分利用多核cpu的特點,浪費了資源
單Reactor多線程
在但Reactor多線程模型下,連接請求及acceptor仍然在一個線程,io的read和send操作也是在Reactor線程,但是將業務邏輯處理交給線程池(多線程),此時不管業務操作多耗時,線程里有多個線程來處理任務,任務之間不會有大的延遲處理的影響,但如果並發太高,Reactor線程也來不及連接請求和讀寫數據,於是主從Reactor多線程模型產生
主從Reactor多線程模型
在這個模型中,主要有一個mainReactor,多個subReactor,以及每個subReactor都附帶一個線程池,這個模型大大的分解了各項處理,mainReactor主要負責監聽來自客戶端的請求(即selector.select()),當有連接請求到達,將會調用Acceptor函數(位於mainReactor線程中),並將產生的socketChannel注冊到一個subReactor的selector中,而且綁定該socketChannel感興趣的事件(interestOps),當有該socketChannel感興趣的時間發生時,該subReactor就會調用selector.select()方法,並將需要完成的任務扔到綁定該subReactor的線程池來執行任務,任務結果返回subReactor,然后由subReactor回復客戶端.
自己學習Reactor線程模型的一點小小理解,借助大神doug.lea的三張圖,第一次寫博客,2333.