reactor设计模式(转)

转自 http://blog.csdn.net/swordmanwk/article/details/6170995

  reactor设计模式,是一种基于事件驱动的设计模式。

  《Pattern-Oriented Software Architecture, Volume 2》对这个模式做了详细的讲解。这个模式的结构图如下:

  图中的handle对应的是操作系统提供的句柄,如I/O句柄,Event_Handler类持有这些句柄。reactor类内部提供一个事件循环:handle_events()。事件循环的代码实现利用了操作系统提供的多路分离函数,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是经常需要根据不同的需求定制的,因此需要提供一个抽象接口类,然后根据实际需求编写派生类,提供具体句柄,并实现相关虚函数。

  这个模式的优点是本身不涉及多线程,从而避免了线程的上下文切换。对于响应事件处理时间较短的情况下,可以考虑使用这个模式。如果处理一个事件需要花费大量时间,就不能使用这个模式,那样会导致其他事件处理被阻塞。

  ACE_Reactor框架是这一模式的半成品,用户只要做三件事情就可以实现并使用这一模式:

  1.从ACE_Event_Handler派生一个或多个类

  2.向ACE_Reactor类登记应用的事件处理对象

  3.运行ACE_Reactor事件循环。

  示例代码可以参考ACE_wrappers/examples/APG/Reactor目录下的示例代码。

参考文献:

  《Pattern-Oriented Software Architecture, Volume 2》

  《ACE程序员指南》

时间: 2024-08-06 19:01:53

reactor设计模式(转)的相关文章

浅析Reactor设计模式

简介:Reactor 设计模式是一种事件驱动的设计模式,将一个或者多个客户端请求分发到不同的处理器上,来提升事件处理的效率.主要的应用场景就是java NIO当中用户处理网络请求.使用的是异步非阻塞IO 在接受Reactor 模式之前,需要先了解常见的几种IO网络模型. 1.BIO(阻塞IO模型) 以套接字模型为例:在进程空间中调用recvfrom, 其系统调用直到数据包到达且被复制到应用进程的缓冲区中或者发生错误时才可以返回,在此期间会一直等待,进程在从调用recvfrom 开始到它返回的整段

Java NIO 与 基于reactor设计模式的事件处理模型

Java NIO非堵塞应用通常适用用在I/O读写等方面,我们知道,系统运行的性能瓶颈通常在I/O读写,包括对端口和文件的操作上,过去,在打开一个I/O通道后,read()将一直等待在端口一边读取字节内容,如果没有内容进来,read()也是傻傻的等,这会影响我们程序继续做其他事情,那么改进做法就是开设线程,让线程去等待,但是这样做也是相当耗费资源的. Java NIO非堵塞技术实际是采取Reactor模式,或者说是Observer模式为我们监察I/O端口,如果有内容进来,会自动通知我们,这样,我们

Reactor设计模式

Reactor的事件处理机制首先来回想一下普通函数调用的机制:程序调用某函数?函数执行,程序等待?函数将结果和控制权返回给程序?程序继续处理.Reactor释义“反应堆”,是一种事件驱动机制.和普通函数调用的不同之处在于:应用程序不是主动的调用某个API完成处理,而是恰恰相反,Reactor逆置了事件处理流程,应用程序需要提供相应的接口并注册到Reactor上,如果相应的时间发生,Reactor将主动调用应用程序注册的接口,这些接口又称为“回调函数”. Reactor模式的优点Reactor模式

POCO库中文编程参考指南(11)如何使用Reactor框架?

1 Reactor 框架概述 POCO 中的 Reactor 框架是基于 Reactor 设计模式进行设计的.其中由 Handler 将某 Socket 产生的事件,发送到指定的对象的方法上,作为回调. 2 光说不练假把式 PoechantReactorServer 类,基本与 PoechantTCPServer: class PoechantReactorServer: public ServerApplication { public: PoechantServer() {} //: _he

I/O复用,select和Reactor模式

I/O复用,select和Reactor模式,各自的概念其间的关系,以及最重要的,他们的优势在哪,与同类相比为什么能具有这样的优势.这就是写这篇文字最初的出发点. I/O复用 I/O复用属于I/O模型中的一种: 1. 阻塞式I/O: 2. 非阻塞式I/O: 3. I/O复用模型 4. 信号驱动式I/O模型 5. 异步I/O模型 以上各个模型之间的比较如下: select select 是c语言中的函数,相对于诸如connect.accept.recv或recvfrom这样的阻塞程序来说,使用se

Java工程师成神之路

对JAVA的学习点总结很好的文章,小伙伴可以看看自己会哪个不会哪个然后针对性学习. 转载自Hollis 一.基础篇 1.1 JVM 1.1.1. Java内存模型,Java内存管理,Java堆和栈,垃圾回收 http://www.jcp.org/en/jsr/detail?id=133 http://ifeve.com/jmm-faq/ 1.1.2. 了解JVM各种参数及调优 1.1.3. 学习使用Java工具 jps, jstack, jmap, jconsole, jinfo, jhat,

高性能IO模型浅析(转)

转自:http://www.cnblogs.com/fanzhidongyzby/p/4098546.html 是我目前看到的解释IO模型最清晰的文章,当然啦,如果想要详细的进一步了解还是继续啃蓝宝书吧. 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking IO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK.注意这里所说的NIO

Explorer : 发布一个key-value存储系统,带有客户端和服务器端

Explorer 一个key-value存储系统,带有客户端和服务器端.使用非常方便. 使用B+树作为存储引擎,客户端和服务器端使用TCP协议进行通信. 代码采用C++实现,底层将客户端和服务器通信封装成了一个网络库,里面还有些还不错的实现可供看看,比如线程池.工作队列.Reactor设计模式实现等等. 项目地址:https://github.com/zinx2016/Explorer (欢迎大家给star  :) 编译方式 make 例子 首先启动服务器程序: 然后,运行客户端程序 : 首先,

python之协程与IO操作

协程 协程,又称微线程,纤程.英文名Coroutine. 协程的概念很早就提出来了,但直到最近几年才在某些语言(如Lua)中得到广泛应用. 子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B在执行过程中又调用了C,C执行完毕返回,B执行完毕返回,最后是A执行完毕. 所以子程序调用是通过栈实现的,一个线程就是执行一个子程序. 子程序调用总是一个入口,一次返回,调用顺序是明确的.而协程的调用和子程序不同. 协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,