基礎 Reactor反應器模式

2021-10-05 04:54:30 字數 1951 閱讀 4112

目錄

一,單執行緒reactor反應器模式

二,多執行緒reactor反應器模式

來由:最傳統的模式中,乙個執行緒,阻塞的完成獨寫任務,效率低下,於是就產生了經典的 "connection per thread"模式,當乙個任務觸發的時候就派發給乙個執行緒去處理,也就是乙個執行緒對應乙個socket,而且乙個執行緒只能處理乙個socket,因為獨寫是阻塞的,如果乙個執行緒處理多個socket也是要排隊的。那麼就出現了大量的執行緒,執行緒的上下文切換是很消耗資源的。於是「reactor"反應器模式誕生了!可以做到乙個執行緒處理大量的連線。!

reactor反應器:負責查詢io事件,將就緒的io事件傳送給相應的handler處理器進行處理。

handler處理器:與io事件進行繫結,負責io事件的處理。完成真正的連線建立,業務處理,把結果寫回信道等等功能。

什麼是單執行緒readctor反應器?

所有任務(selector,handler,channel)都處於同乙個執行緒中,當selector.select()方法獲得多個key的時候,使用while迴圈,一次提取乙個key,抓取到對應的handler進行執行,然後while()直到key處理完畢。

缺點:reactor和handler在同乙個執行緒,那麼當乙個handler阻塞了,那麼後面的handler也阻塞了,那麼系統會崩潰。

handler處理器:使用多執行緒,公升級為執行緒池。比如多個執行緒來處理read操作,多個執行緒來吃力write操作。

進一步,還可以公升級selector: 引入多個selector選擇器,提示選擇大量通道能力。這裡就和kafka的模式一樣了。

}// handler的呼叫。入門;

public void dispatch(selectionkey sk)

}class acceptorhandler implements runnablecatch(exception e)

if(next.incrementandget()==selectors.length)

next.set(0);}}

}多執行緒handler處理器:

public class ahandler 

public void run()

public synchronized void asyncrun() else if(state==recieving)

}catch(exception e)

}class asynctask implements runnable}}

Reactor模式(反應器模式)

reactor這個詞譯成漢語還真沒有什麼合適的,很多地方叫反應器模式,但更多好像就直接叫reactor模式了,其實我覺著叫應答者模式更好理解一些。通過了解,這個模式更像乙個侍衛,一直在等待你的召喚,或者叫召喚獸。併發系統常使用reactor模式,代替常用的多執行緒的處理方式,節省系統的資源,提高系統...

Reactor反應器模式 epoll

最近在看redis原始碼,主體流程看完了。在網上看到了reactor模式,看了一下,其實我們經常使用這種模式。反應器設計模式 reactor pattern 是一種為處理併發服務請求,並將請求提交到乙個或者多個服務處理程式的事件設計模式。當客戶端請求抵達後,服務處理程式使用多路分配策略,由乙個非阻塞...

設計模式 反應器(Reactor)模式

從學習zeromq說起 zeromq幾乎所有的i o操作都是非同步的,主線程不會被阻塞。zeromq會根據使用者呼叫zmq init函式時傳入的介面引數,建立對應數量的i o thread。每個i o thread都有與之繫結的poller,poller採用經典的reactor模式實現,poller...