ACE前攝器Proactor模式

2021-04-20 05:55:10 字數 3377 閱讀 1192

當os 平台支援非同步操作時,一種高效而方便的實現高效能 web 伺服器的方法是使用前攝式事件分派。使用前攝式事件分派模型設計的 web 伺服器通過一或多個執行緒控制來處理非同步操作的完成。這樣,通過整合完成事件多路分離(completion event demultiplexing)和事件處理器分派,前攝器模式簡化了非同步的 web 伺服器。

非同步的 web 伺服器將這樣來利用前攝器模式:首先讓 web 伺服器向 os 發出非同步操作,並將**方法登記到 completion dispatcher(完成分派器),後者將在操作完成時通知 web 伺服器。於是 os 代表 web 伺服器執行操作,並隨即在乙個周知的地方將結果排隊。completion dispatcher 負責使完成通知出隊,並執行適當的、含有應用特有的 web 伺服器**的**。

使用前攝器模式的主要優點是可以啟動多個併發操作,並可並行執行,而不要求應用必須擁有多個執行緒。操作被應用非同步地啟動,它們在 os 的 i/o 子系統中執行直到完成。發起操作的執行緒現在可以服務 另外的請求了。

在ace中,可以通過ace_proactor實現前攝器模式。實現方式如下。

1。建立服務處理器:

proactor框架中服務處理器均派生自ace_service_handler,它和reactor框架的事件處理器非常類似。當發生io操作完成事件時,會觸發相應的事件完成會調函式。

2。實現服務處理器io操作

proactor框架中所有的io操作都由相應的非同步操作類來完成,這些非同步操作類都繼承自ace_asynch_operation。常用的有以下幾種。

ace_asynch_read_stream, 提供從tcp/ip socket連線中進行非同步讀操作.

ace_asynch_write_stream, 提供從tcp/ip socket連線中進行非同步寫操作.

使用這些操作類的一般方式如下:

初始化將相關的操作註冊到服務處理器中,一般可通過呼叫其open方法實現。

發出io操作

發出非同步io操作請求,該操作不會阻塞,具體的io操作過程由作業系統非同步完成。

io操作完成**處理

非同步io操作完成後,os會觸發服務處理器中的相應**函式,可通過該函式的ace_asynch_result引數獲取相應的返回值。

3。使用聯結器或接受器和遠端進行連線

ace為proactor框架提供了兩個工廠類來建立tcp/ip連線。

ace_asynch_acceptor, 用於被動地建立連線

ace_asynch_connector 用於主動地建立連線

當遠端連線建立時,聯結器或接受器便會建立相應的服務處理器,從而可以實現服務處理。

4。啟動proactor事件分發處理

啟動事件分發處理只需如下呼叫:

while(true)

ace_proactor::instance ()->handle_events ();

5。程式示例

伺服器端:

伺服器端簡單的實現了乙個echoserver,流程如下:

當客戶端建立連線時,首先發出乙個非同步讀的非同步請求,當讀完成時,將所讀的資料列印出來,並發出乙個新的非同步請求。

#include

"ace/message_queue.h"

#include

"ace/asynch_io.h"

#include

"ace/os.h"

#include

"ace/proactor.h"

#include

"ace/asynch_acceptor.h"

class ha_proactive_service : public ace_service_handler

virtual

void open (ace_handle h, ace_message_block&)

ace_message_block *mb = new ace_message_block(buffer,1024);

if (this->reader_.read (*mb, mb->space ()) != 0)

return;}//

非同步讀完成後會呼叫此函式

virtual

void handle_read_stream

(const ace_asynch_read_stream::result &result)

mb.copy("");    //

為字串新增結束標記

'/0'

ace_os::printf("rev:/t%s/n",mb.rd_ptr());

mb.release();

ace_message_block *nmb = new ace_message_block(buffer,1024);

if (this->reader_.read (*nmb, nmb->space ()) != 0)

return;

}private:

ace_asynch_read_stream reader_;

char buffer[1024];

};int main(int argc, char *argv)

客戶端:

客戶端**比較簡單,就是每隔1秒鐘將當前的系統時間轉換為字串形式通過非同步形式傳送給伺服器,傳送完成後,釋放時間字元的記憶體空間。

#include

"ace/message_queue.h"

#include

"ace/asynch_io.h"

#include

"ace/os.h"

#include

"ace/proactor.h"

#include

"ace/asynch_connector.h"

class ha_proactive_service : public ace_service_handler

virtual

void open (ace_handle h, ace_message_block&)

ace_os::printf("connceted");

for(int i=0;i<10;i++)    //

每隔秒中傳送時間至伺服器

}return;}//

非同步寫完成後會呼叫此函式

virtual

void handle_write_dgram

(const ace_asynch_write_stream::result &result)

private:

ace_asynch_write_stream writer_;

};int main(int argc, char *argv)

ACE前攝器Proactor模式 收藏

ace前攝器proactor模式 收藏 標籤 當 os 平台支援非同步操作時,一種高效而方便的實現高效能 web 伺服器的方法是使用前攝式事件分派。使用前攝式事件分派模型設計的 web 伺服器通過一或多個執行緒控制來處理非同步操作的完成。這樣,通過整合完成事件多路分離 completion even...

ACE學習前準備工作

開宗明義 每當我們準備花費時間和精力去完成某件事情之前,首先要明析為什麼要去做這件事情,其次要明確目標,其後就是準備工作了。學習ace原由 基於c s開發過程中程序通訊和多執行緒併發處理的煩瑣及多平台可移植性,總想開發這方面的基礎庫,把各種變化封裝成統一介面,後來在維護工作中接觸到ace,發現前人早...

課二 前攝器設計模式(不使用多執行緒併發)

asio庫為同步和非同步提供一一對應的操作。非同步支援是基於前攝器設計模式。該模式的優勢和劣勢將在下面說明,與之對應的是反射器模式,該模式是一種同步模式。前攝器的實現 在asio庫中,前攝器的實現方式如下,該實現方式跨平台一致。前攝器設計模式 一 非同步操作 定義乙個非同步執行的操作,例如在乙個套接...