日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

IO:Reactor设计模式

發布時間:2025/3/21 asp.net 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IO:Reactor设计模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

reactor設計模式

reactor設計模式,是一種基于事件驅動的設計模式。

?這個模式的結構圖如下:


?圖中的handle對應的是操作系統提供的句柄,例如I/O句柄,Event_Handler類持有這些句柄,(其實就是事件,可以看成是Type)

Handles:表示操作系統管理的資源,我們可以理解為fd

Synchronous Event Demultiplexer:同步事件分離器,阻塞等待Handles中的事件發生(select、poll、epoll)

Initiation Dispatcher(Reactor):初始分派器,作用為添加Event handler(事件處理器)刪除Event handler以及分派事件給Event handler也就是說,SynchronousEvent Demultiplexer負責等待新事件發生,事件發生時通知InitiationDispatcher(Reactor),然后Initiation Dispatcher調用event handler處理事件

Event Handler:事件處理器的接口

Concrete Event Handler:事件處理器的實際實現,而且綁定了一個Handle因為在實際情況中,我們往往不止一種事件處理器,因此這里將事件處理器接口和實現分開,與C++Java這些高級語言中的多態類似


過程如下:

?reactor類內部提供一個事件循環:handle_events(),事件循環的代碼實現利用了操作系統提供的多路分離函數(Select,poll,epoll等)(這個方法調用多路復用器。)

?WaitForMultipleObjects或者select等,這些多路分離的函數的特點是,可以同時等待多個句柄,在等待過程中所在線程屬于掛起狀態(阻塞),不消耗CPU時間,一旦某個句柄被觸發,則線程被喚醒,函數將返回,線程可以執行后面的代碼,?

利用多路分離函數的這一特點,根據被激活的句柄對應的特定事件,調用相關的事件處理函數。可以實現事件循環。

?register_handler()函數用于將Event_Handler對象注冊到事件驅動列表?中,保證對于某一類型的事件,會調用Event_Handler類的響應函數handle_event()。?

reactor類在做多路分離時需要操縱Event_Handler類的Handle,因此Event_Handler類需要提供get_handle()函數。?

另外,當程序不需要再對特定事件響應時,需要把Event_Handler對象從事件驅動列表中刪除,因此reactor類還實現了?remove_handler函數。

?因為reactor相對穩定,一旦實現,不需要再定制,所以沒有提供一個抽象接口類,但Event_Handler是經常需要根據不同?的需求定制的,因此需要提供一個抽象接口類,然后根據實際需求編寫派生類,提供具體句柄,并實現相關虛函數。


?

Reactor模式實現

在Reactor An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events中,一直以Logging Server來分析Reactor模式,這個Logging Server的實現完全遵循這里對Reactor描述,因而放在這里以做參考。Logging Server中的Reactor模式實現分兩個部分:Client連接到Logging Server和Client向Logging Server寫Log。因而對它的描述分成這兩個步驟。
Client連接到Logging Server

Reactor_LoggingServer_connect.png

?

  • Logging Server注冊LoggingAcceptor到InitiationDispatcher。
  • Logging Server調用InitiationDispatcher的handle_events()方法啟動。
  • InitiationDispatcher內部調用select()方法(Synchronous Event Demultiplexer),阻塞等待Client連接。
  • Client連接到Logging Server。
  • InitiationDisptcher中的select()方法返回,并通知LoggingAcceptor有新的連接到來。
  • LoggingAcceptor調用accept方法accept這個新連接。
  • LoggingAcceptor創建新的LoggingHandler。
  • 新的LoggingHandler注冊到InitiationDispatcher中(同時也注冊到Synchonous Event Demultiplexer中),等待Client發起寫log請求。
    Client向Logging Server寫Log

    Reactor_LoggingServer_log.png

  • Client發送log到Logging server。
  • InitiationDispatcher監測到相應的Handle中有事件發生,返回阻塞等待,根據返回的Handle找到LoggingHandler,并回調LoggingHandler中的handle_event()方法。
  • LoggingHandler中的handle_event()方法中讀取Handle中的log信息。
  • 將接收到的log寫入到日志文件、數據庫等設備中。
    3.4步驟循環直到當前日志處理完成。
  • 返回到InitiationDispatcher等待下一次日志寫請求。

  • 這模式的優點是本身不涉及多線程,從而避免了線程的上下文切換。

    ?對于響應事件處理時間較短的情況下,可以考慮使用這個模式。

    ?如果處理一個事件需要花費大量時間,就不能使用這個模式,那樣會導致其他事件處理被阻塞。

    ?ACE_Reactor框架是這一模式的半成品,用戶只要做三件事情就可以實現并使用這一模式:

    ?1.從Event_Handler派生一個或多個類

    2.向Reactor類登記應用的事件處理對象

    3.運行Reactor事件循環(它就會調用IO分離函數,開始輪訊事件,等到有事件返回,傳給事件處理者)。
    ?

    總結

    以上是生活随笔為你收集整理的IO:Reactor设计模式的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。