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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ACE前摄器Proactor模式

發(fā)布時(shí)間:2025/3/13 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ACE前摄器Proactor模式 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

版權(quán)聲明:轉(zhuǎn)載時(shí)請(qǐng)以超鏈接形式標(biāo)明文章原始出處和作者信息及本聲明
http://egeho123.blogbus.com/logs/10780720.html

ACE前攝器Proactor模式

當(dāng) OS 平臺(tái)支持異步操作時(shí),一種高效而方便的實(shí)現(xiàn)高性能 Web 服務(wù)器的方法是使用前攝式事件分派。使用前攝式事件分派模型設(shè)計(jì)的 Web 服務(wù)器通過一或多個(gè)線程控制來處理異步操作的完成。這樣,通過集成完成事件多路分離(completion event demultiplexing)和事件處理器分派,前攝器模式簡(jiǎn)化了異步的 Web 服務(wù)器。

異步的 Web 服務(wù)器將這樣來利用前攝器模式:首先讓 Web 服務(wù)器向 OS 發(fā)出異步操作,并將回調(diào)方法登記到 Completion Dispatcher(完成分派器),后者將在操作完成時(shí)通知 Web 服務(wù)器。于是 OS 代表 Web 服務(wù)器執(zhí)行操作,并隨即在一個(gè)周知的地方將結(jié)果排隊(duì)。Completion Dispatcher 負(fù)責(zé)使完成通知出隊(duì),并執(zhí)行適當(dāng)?shù)摹⒑袘?yīng)用特有的 Web 服務(wù)器代碼的回調(diào)。

使用前攝器模式的主要優(yōu)點(diǎn)是可以啟動(dòng)多個(gè)并發(fā)操作,并可并行運(yùn)行,而不要求應(yīng)用必須擁有多個(gè)線程。操作被應(yīng)用異步地啟動(dòng),它們?cè)?OS 的 I/O 子系統(tǒng)中運(yùn)行直到完成。發(fā)起操作的線程現(xiàn)在可以服務(wù) 另外的請(qǐng)求了。

在ACE中,可以通過ACE_Proactor實(shí)現(xiàn)前攝器模式。實(shí)現(xiàn)方式如下。

1。創(chuàng)建服務(wù)處理器:

Proactor框架中服務(wù)處理器均派生自ACE_Service_Handler,它和Reactor框架的事件處理器非常類似。當(dāng)發(fā)生IO操作完成事件時(shí),會(huì)觸發(fā)相應(yīng)的事件完成會(huì)調(diào)函數(shù)。

2。實(shí)現(xiàn)服務(wù)處理器IO操作

Proactor框架中所有的IO操作都由相應(yīng)的異步操作類來完成,這些異步操作類都繼承自ACE_Asynch_Operation。常用的有以下幾種。

  • ACE_Asynch_Read_Stream, 提供從TCP/IP socket連接中進(jìn)行異步讀操作.
  • ACE_Asynch_Write_Stream, 提供從TCP/IP socket連接中進(jìn)行異步寫操作.
  • 使用這些操作類的一般方式如下:

  • 初始化
    將相關(guān)的操作注冊(cè)到服務(wù)處理器中,一般可通過調(diào)用其open方法實(shí)現(xiàn)。
  • 發(fā)出IO操作
    發(fā)出異步IO操作請(qǐng)求,該操作不會(huì)阻塞,具體的IO操作過程由操作系統(tǒng)異步完成。
  • IO操作完成回調(diào)處理
    異步IO操作完成后,OS會(huì)觸發(fā)服務(wù)處理器中的相應(yīng)回調(diào)函數(shù),可通過該函數(shù)的ACE_Asynch_Result參數(shù)獲取相應(yīng)的返回值。
  • 3。使用連接器或接受器和遠(yuǎn)端進(jìn)行連接

    ACE為Proactor框架提供了兩個(gè)工廠類來建立TCP/IP連接。

  • ACE_Asynch_Acceptor, 用于被動(dòng)地建立連接
  • ACE_Asynch_Connector 用于主動(dòng)地建立連接
  • 當(dāng)遠(yuǎn)端連接建立時(shí),連接器或接受器便會(huì)創(chuàng)建相應(yīng)的服務(wù)處理器,從而可以實(shí)現(xiàn)服務(wù)處理。

    4。啟動(dòng)Proactor事件分發(fā)處理

    啟動(dòng)事件分發(fā)處理只需如下調(diào)用:

    ????while(true)
    ????????ACE_Proactor::instance ()->handle_events ();

    5。程序示例

    服務(wù)器端:

    服務(wù)器端簡(jiǎn)單的實(shí)現(xiàn)了一個(gè)EchoServer,流程如下:

    當(dāng)客戶端建立連接時(shí),首先發(fā)出一個(gè)異步讀的異步請(qǐng)求,當(dāng)讀完成時(shí),將所讀的數(shù)據(jù)打印出來,并發(fā)出一個(gè)新的異步請(qǐng)求。

    #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
    {
    public:
    ~HA_Proactive_Service ()
    {
    if (this->handle () != ACE_INVALID_HANDLE)
    ACE_OS::closesocket (this->handle ());
    }

    virtual void open (ACE_HANDLE h, ACE_Message_Block&)
    {
    ???? this->handle (h);
    ???? if (this->reader_.open (*this) != 0 )
    ???? {
    ???????? ACE_ERROR ((LM_ERROR, ACE_TEXT ("%p/n"),
    ???????????? ACE_TEXT ("HA_Proactive_Service open")));
    ???????? delete this;
    ???????? return;
    ???? }

    ???? ACE_Message_Block *mb = new ACE_Message_Block(buffer,1024);
    ???? if (this->reader_.read (*mb, mb->space ()) != 0)
    ???? {
    ???????? ACE_OS::printf("Begin read fail/n");
    ???????? delete this;
    ???????? return;
    ???? }

    ???? return;
    }

    //
    異步讀完成后會(huì)調(diào)用此函數(shù)
    virtual void handle_read_stream
    (const ACE_Asynch_Read_Stream::Result &result)
    {
    ???? ACE_Message_Block &mb = result.message_block ();
    ???? if (!result.success () || result.bytes_transferred () == 0)
    ???? {
    ???????? mb.release ();
    ???????? delete this;
    ???????? return;
    ???? }

    ???? mb.copy("");????//
    為字符串添加結(jié)束標(biāo)記'/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[])
    {
    ????int port=3000;
    ????ACE_Asynch_Acceptor<HA_Proactive_Service> acceptor;
    ????
    ????if (acceptor.open (ACE_INET_Addr (port)) == -1)
    ????????return -1;

    ????while(true)
    ????????ACE_Proactor::instance ()->handle_events ();
    ????
    ????return 0;
    }

    客戶端:

    客戶端代碼比較簡(jiǎn)單,就是每隔1秒鐘將當(dāng)前的系統(tǒng)時(shí)間轉(zhuǎn)換為字符串形式通過異步形式發(fā)送給服務(wù)器,發(fā)送完成后,釋放時(shí)間字符的內(nèi)存空間。

    #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
    {
    public:
    ~HA_Proactive_Service ()
    {
    if (this->handle () != ACE_INVALID_HANDLE)
    ACE_OS::closesocket (this->handle ());
    }

    virtual void open (ACE_HANDLE h, ACE_Message_Block&)
    {
    ???? this->handle (h);
    ???? if (this->writer_.open (*this) != 0 )
    ???? {
    ???????? ACE_ERROR ((LM_ERROR, ACE_TEXT ("%p/n"),
    ???????????? ACE_TEXT ("HA_Proactive_Service open")));
    ???????? delete this;
    ???????? return;
    ???? }

    ???? ACE_OS::printf("connceted");

    ???? for(int i=0;i<10;i++)????//
    每隔秒中發(fā)送時(shí)間至服務(wù)器
    ???? {
    ???????? ACE_OS::sleep(1);
    ???????? time_t now = ACE_OS::gettimeofday().sec();
    ???????? char *time = ctime(&now);????????//
    獲取當(dāng)前時(shí)間的字符串格式
    ???????? ACE_Message_Block *mb = new ACE_Message_Block(100);
    ???????? mb->copy(time);

    ???????? if (this->writer_.write(*mb,mb->length()) !=0)
    ???????? {
    ???????????? ACE_OS::printf("Begin read fail/n");
    ???????????? delete this;
    ???????????? return;
    ???????? }
    ???? }

    ???? return;
    }

    //
    異步寫完成后會(huì)調(diào)用此函數(shù)
    virtual void handle_write_dgram
    (const ACE_Asynch_Write_Stream::Result &result)
    {
    ???? ACE_Message_Block &mb = result.message_block ();
    ???? mb.release();
    ???? return;
    }

    private:
    ACE_Asynch_Write_Stream writer_;
    };

    int main(int argc, char *argv[])
    {
    ????
    ????ACE_INET_Addr addr(3000,"192.168.1.142");

    ????HA_Proactive_Service *client = new HA_Proactive_Service();
    ????ACE_Asynch_Connector<HA_Proactive_Service> connector;
    ????
    ????connector.open();
    ????if (connector.connect(addr) == -1)
    ????????return -1;

    ????while(true)
    ????????ACE_Proactor::instance ()->handle_events ();
    ????
    ????return 0;
    }

    轉(zhuǎn)載于:https://www.cnblogs.com/qitian1/archive/2010/03/12/6462003.html

    總結(jié)

    以上是生活随笔為你收集整理的ACE前摄器Proactor模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 自拍偷拍视频在线观看 | 香港av在线 | 激情av在线播放 | 五月婷婷免费视频 | 电影91久久久 | 亚洲免费不卡视频 | 免费网站在线观看人数在哪动漫 | 国产欧美一区二区精品性色超碰 | 亚洲v国产v| 日韩免费看片 | 在线观看av片 | 香蕉网在线播放 | 成人黄色免费 | 国产牛牛 | 亚洲av片不卡无码久久 | av一级网站 | 国产黄色免费在线观看 | 日韩一级免费 | 精品人妻在线播放 | 美女一区二区视频 | 邻居少妇张开腿让我爽了在线观看 | 欧美丰满熟妇bbbbbb百度 | 国产欧美一区二区精品忘忧草 | 亚洲乱亚洲乱 | 97视频在线 | 在线精品一区二区 | 欧美三级理论片 | 极品美女销魂一区二区三区 | 波多野结衣1区2区3区 | 国产喷水福利在线视频 | 五月深爱网| 久久亚洲天堂 | 免费在线观看黄网站 | 国产激情无套内精对白视频 | jizz中国少妇高潮出水 | 欧美丰满熟妇xxxx | 日本专区在线 | 天天操天天做 | 经典三级在线视频 | 丰满人妻一区二区三区大胸 | 郑艳丽三级 | 人人爽视频 | 人妻熟女一区二区三区 | 四虎精品一区二区 | 涩涩在线看| 草久久 | 成人日b视频 | www国产成人 | 国产福利小视频 | 亚洲成人网页 | 色图综合网 | 亚洲一区二区伦理 | 91草草草 | 久久亚洲综合国产精品99麻豆精品福利 | 久久婷婷一区 | 亚洲一区二区在线电影 | 青草伊人网| 成人夜色| 国产福利在线看 | 日本一本视频 | 日韩欧美有码 | 成人av免费在线播放 | 免费操人视频 | 亚洲国产精品成人无久久精品 | av一区二区在线观看 | 在线观看国产一区二区 | 亚洲激情文学 | 欧日韩在线观看 | 日韩毛片高清在线播放 | 色小姐在线视频 | 九色网站在线观看 | 欧美精品色 | 美女野外找人搭讪啪啪 | 精品欧美黑人一区二区三区 | 一本色道久久综合熟妇 | 寡妇av| 韩国精品在线观看 | 黄色一级a毛片 | 涩色视频 | 日韩视频第一页 | 欧美亚洲不卡 | 亚洲裸体视频 | 羽月希奶水一区二区三区 | 国产成人综合久久 | 色戒av| 亚洲乱码国产乱码精品精98午夜 | 免费久久精品视频 | 好紧好爽再浪一点视频 | 欧美激情二区三区 | 爱啪啪av | 亚洲一级色 | 成人国产一区二区三区精品麻豆 | 性欧美xxxx | 日本熟女毛茸茸 | 国产一级二级在线观看 | 欧美毛片在线观看 | 国产a区 | 免费不卡的av | 特级西西人体444www高清 |