Reactor模型库之boost::asio::io_service与ACE_Reactor
来源:互联网 发布:patternlayout源码 编辑:程序博客网 时间:2024/06/05 15:30
boost::asio::io_service与ACE_Reactor均是应用了Reactor同步IO模型,下面通过类比对这两个库进行学习。
“Reactor模式是处理并发I/O比较常见的一种模式,中心思想就是,将所有要处理的I/O事件注册到一个中心I/O多路复用器上,同时主线程阻塞在多路复用器上;一旦有I/O事件到来或是准备就绪(区别在于多路复用器是边沿触发还是水平触发),多路复用器返回并将相应I/O事件分发到对应的处理器中。
这里有三个重要的组件:
- 多路复用器:由操作系统提供,在linux上一般是select, poll, epoll等系统调用。
- 事件分发器:将多路复用器中返回的就绪事件分到对应的处理函数中。
- 事件处理器:负责处理特定事件的处理函数。
因为这种模型经常使用,所有不少人对简单的系统调用做了一层封装,形成跨平台的事件处理库,比较典型的有:libevent,libev,boost asio、ACE_Reactor等。”(引号部分引用自网页)。
boost::asio::io_service与ACE_Reactor的区别是,后者可以对除io外的事件进行分发处理。
实例说明:使用boost::asio::io_service与boost::asio::deadline_timer实现定时任务:
首先,需要创建的主要角色有:
1、一个主线程,一个子线程(负责运行io_service),一个定时器;
然后,实现步骤如下:
1、定义定时器,定时器与io_service对象绑定,定时器与到时操作方法绑定;
2、创建子线程运行io_service。
后台运行解析:
当定时器时间到时,io_service监控到以后触发与定时器绑定的操作方法。
首先,需要创建的主要角色有:
1、一个主进程,一个进程管理器ACE_Process_Manager对象,若干个子进程;
2、继承自ACE_Event_Handler的事件处理器,参数是触发该事件的子进程,主要是进行子进程崩溃后的重启;
3、事件分发器,一般直接使用ACE_Reactor的实例,监控子进程崩溃事件。
然后,实现步骤如下:
1、绑定ACE_Process_Manager对象与ACE_Reactor实例;
2、ACE_Process_Manager对象创建子进程,通过ACE_Process_Manager的register_handler方法,将事件处理器与触发此事件的具体子进程绑定。
后台实现解析:
当子进程崩溃退出时,主进程通过ACE_Reactor监听(同步等待)到以后触发事件处理器,事件处理器回调子进程,进行重启。
由此可见Reactor模型是处理多进程、多线程任务的常用模型之一,根据应用程序与操作系统之间的操作分类,属于同步处理模型。但是如果对io_service或者ACE_Reactor单独创建线程或进程执行,
则对外部主程序来说,则成为异步调用,因此也可以用来构建异步网络程序(这个异步是指客户端与服务端的交互)。(即对该对象 内部是同步的,外部是异步的。)
0 0
- Reactor模型库之boost::asio::io_service与ACE_Reactor
- boost::asio 之io_service
- boost asio io_service与 strand 分析
- boost::asio::io_service与socket(C++)
- boost asio 学习总结之 io_service
- Boost.Asio网络库之io_service分析
- boost::asio::Io_service
- boost::asio::Io_service
- boost::asio::Io_service
- boost::asio::Io_service
- boost::asio::Io_service strand
- boost::asio::io_service(之一)
- Boost::asio io_service
- Boost::asio io_service
- io_service类 boost asio
- 【boost学习】之boost::asio(2)——io_service
- boost asio io_service 原理及与strand的比较
- boost asio io_service学习笔记
- 快速排序
- 宽字符sql注入
- java中try中return语句与finally块执行顺序问题
- LeetCode---Happy Number
- jQuery入门学习笔记----第二章 jQuery选择器
- Reactor模型库之boost::asio::io_service与ACE_Reactor
- windbg命令
- 文件工具类-FileUtil
- 用Swift做个游戏Lecture01 —— 初窥游戏场景
- wireshark捕获/过滤指定ip地址数据包
- Tiff、jpg图片怎么样添加地理坐标信息
- servlet (2) 生命周期
- AsyncTask 使用和缺陷
- android sqlite数据库的增删改查