反應堆模式

来源:http://www.cnblogs.com/xujian2014/archive/2016/07/27/5711828.html
-Advertisement-
Play Games

一、概念 1、定義 反應堆模式是一種對象行為類的設計模式,對同步事件分揀和派發。它是處理併發I/O比較常見的一種模式,用於同步I/O。 其中心思想是將所有要處理的I/O事件註冊到一個中心I/O多路復用器上,同時主線程阻塞在多路復用器上;一旦有I/O事件到來或者是準備就緒,多路復用器返回並將相應的I/ ...


一、概念

  1、定義

  反應堆模式是一種對象行為類的設計模式,對同步事件分揀和派發。它是處理併發I/O比較常見的一種模式,用於同步I/O。

  其中心思想是將所有要處理的I/O事件註冊到一個中心I/O多路復用器上,同時主線程阻塞在多路復用器上;一旦有I/O事件到來或者是準備就緒,多路復用器返回並將相應的I/O事件分發到對應的處理器中。

  2、Reactor事件處理機制

    Reactor是一種事件驅動機制,和普通函數的不同之處在於:應用程式不是主動的調用某個API完成處理,Reactor逆置了事件處理流程,應用程式需要提供相應的介面並註冊到Reactor上,如果相應的時間發生,Reactor將主動調用應用程式註冊的介面(這些介面又被稱為"回調函數")。下麵是事件驅動機制的模型圖:

  

  事件驅動(回調)就是應用業務向一個中間人註冊一個回調(event handler),當I/O就緒後,就向這個中間人產生一個事件,並通知此handler進行處理。這個中間人是由一個不斷等待和迴圈的單獨線程來承擔,它接受所有的handler的註冊,並負責向操作系統查詢IO是否就緒在就緒後就調用指定的handler進行處理。這個中間人的名字就就叫做Reactor。

  3、優點

  Reactor模式是編寫高性能網路伺服器的必備技術,主要有以下優點:

  • 相應快,不必為單個同步事件所阻塞,雖然Reactor本身也是同步的
  • 避免了多線程/進程的的切換開銷
  • 可擴展性,可以方便的通過增加Reactor實例個數來充分利用CPU資源

二、反應堆模式組成

  

  

  1、Handler事件源

  Handler代表操作系統管理的資源,包括:網路連接、打開的文件、同步對象等等。事件可以來自外部,如客戶端的連接請求、數據等,也可以來自內部,如定時器事件。

  2、Synchronous event demultiplexer同步事件分離器(事件多路分發機制)

  由操作系統提供的I/O多路復用機制,例如select和epoll,程式首先將其關心的句柄(即事件源)及其事件註冊到event demultiplexer上,當有事件到達時,event demultiplexer會發出通知“在已經註冊的句柄集中,一個或者多個句柄的事件已經就緒”;程式收到通知後,就可以在非阻塞的情況下對事件進行處理了。

  3、event Handler事件處理介面

  一個或多個模板函數組成的介面,描述了和應用程式相關的對某個事件的操作

  4、concrete event Handler具體的事件處理器

  事件處理介面的實現,實現了應用程式提供的某個服務

  5、Reactor反應器

  定義了一些介面,用於應用程式控制事件調度,以及應用程式註冊、刪除事件處理器和相關的描述符,是事件處理器的調度核心。Reactor管理器使用同步事件分離器來等待事件的發生。一旦事件發生,Reactor管理器先是分離每個事件,然後調度事件處理器,最後調用相關的模 板函數來處理這個事件。

三、NIO中的Reactor模式

  NIO中Reactor的核心是Selector。下麵是一個簡單的示例:

public class Reactor implements Runnable
{
    Selector selector;
    public Reactor() throws IOException
    {
        selector = Selector.open();
    }
    public void run()
    {
        try
        {
            while (!Thread.interrupted())
            {
                // 迴圈,等待事件
                selector.select();
                Set selected = selector.selectedKeys();
                Iterator it = selected.iterator();
                while (it.hasNext())
                    // 調用handler,處理事件
                    dispatch((SelectionKey) (it.next()));
                selected.clear();
            }
        } catch (IOException ex)
        { /* ... */
        }
    }
    void dispatch(SelectionKey k)
    {
        Runnable r = (Runnable) (k.attachment());
        if (r != null)
            r.run();
    }
}

四、參考資料

  1、http://ifeve.com/netty-reactor-4/

  2、http://www.2cto.com/kf/201504/389198.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本書介紹 你是不是對Django的學習感到迷茫?是不是對網上零星的教程感到絕望?是不是苦於沒有可以迅速上手的實例而發愁?如果你同我一樣有這些感受,那麼《Django.By.Example》這本書將是你指路的明燈。 本書基於Django1.8 + Python3.4的環境,裡面包含了個人博客、社交網站 ...
  • HttpSession HttpServletRequest.getSession() HibernateSessionFactory.getSession() HttpSession的生命周期是以上三者中最長的,存在於整次對話(瀏覽器關閉後被銷毀),用於存儲單個用戶在本次會話中所用到的數據。 Ht ...
  • 1.錯誤: 在eclipse中使用run->run on server的時候,選擇tomcat6會報錯誤:The server does not support version 3.0 of the J2EE Web module specification 如下所示: 2.原因: Tomcat 6 ...
  • R語言中的機器學習程式包主要如下所示: ...
  • learn python3   這是我初學Python時寫的一套Python基礎示常式序.主要基於廖雪峰老師的Python3教程和<<深入理解Python>>. 感謝! 下麵是這些示常式序的目錄總結:  Chapter1:容器/集合/C ...
  • @(MyBatis)[Cache] MyBatis源碼分析——Cache構建以及應用 SqlSession使用緩存流程 如果開啟了二級緩存,而Executor會使用CachingExecutor來裝飾,添加緩存功能,該CachingExecutor會從MappedStatement中獲取對應的Cac ...
  • 當我們享受著jdk帶來的便利時同樣承受它帶來的不幸惡果。通過分析Hashtable就知道,synchronized是針對整張Hash表的,即每次鎖住整張表讓線程獨占,安全的背後是巨大的浪費,而現在的解決方案 ConcurrentHashMap。 ConcurrentHashMap和Hashtable ...
  • 正好需要,在網上找了好久,記錄一下 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...