设计模式-前摄器模式(Proactor)

本周要进行boost asio库的学习,在学习之前发现最好需要先了解一下前摄器模式,这样对asio库的理解很有帮助,故写下此文

我之前写的随笔XShell的模拟实现中的链接方式可以说是同步的(服务器阻塞等待链接),这样当有服务器端在等待链接的时候就浪费了大量的资源,我们可以让服务器异步等待客户端的链接,服务器在等待链接的同时可以做别的事情,等到客户端链接请求到来的时候,调用一个回调执行链接,这就很灵活。

先来一段关于前摄器模式的官话:前摄器模式支持多个事件处理器的多路分离和分派,这些处理器由异步事件的完成来触发。通过集成完成事件(completion event)的多路分离和相应的事件处理器的分派,该模式简化了异步应用的开发。

简单点说,前摄器的实现多亏了多个事件处理器将事件和处理分离开,和处理方式的分派。而这些事件处理器的的触发方式是当被异步事件(仅限完成事件)通知而出发的。把这些个东西搞在一起就是前摄器模式了。

  • 前摄器(proactor)模式

前摄器模式主要利用操作系统的异步操作特性(如果操作系统不支持异步的话前摄器模式就。。。),简单的说,当你想到异步的时候第一反应一般就是select,poll和epoll这几个函数吧(或者是类似Qt的消息和槽函数之类的),当你的select函数捕捉到一个请求的时候,就执行一个操作(例如传输一个小视频),不过这一般都是在编写的应用程序中实现的,前摄器和这个方式不同的地方就是,它可以让别人帮他干搬砖的活,当浏览器请求一个文件,事件处理器就会把这个请求告诉操作系统,让操作系统去办,而事件处理器本身只关注操作系统发送回来的完成事件,事件处理器收到完成事件就拿操作系统搬好的砖,交给工头,任务就算完成了。下面对连接请求和文件请求两个操作进行图片详解~

  1. web服务器本身应该先开启接受连接的操作,并且把异步连接(就是说select函数你得写好并且调用吧,不然怎么接受连接请求)的操作准备好,以备客户端(这里就是浏览器啦)连接
  2. 和操作系统沟通,注册相关函数(例如回调函数之类的)
  3. 为事件分离器注册好回调函数
  4. 浏览器发送连接请求
  5. 这时候连接请求的处理实质上是由操作系统处理的(应用程序把最累的活丢给操作系统干)
  6. 事件分离器本身只关注完成事件,俨然一副小工头模样(事件分离器:操作系统你干完了叫我就行)
  7. 被事件分离器通知的接收器创建http事件处理器解析请求数据

  1. 某用户通过浏览器想要下载小视频,于是就上网下
  2. 模范劳工操作系统把请求数据放在缓冲区中        操作系统:报告老大,搬完了
  3. 事件分离器把事件完成告诉事件处理器                小工头事件分离器:操作系统你干的不错,但是你的功劳是我的了
  4. http事件处理器解析缓冲区中保存的请求数据,发现居然有人要下小视频
  5. http事件处理器只能悲催的去文件系统中同步的读文件
  6. 但是读完的数据要放在socket连接上,往这上写又耗时又费力,能不能找个老实人帮我干呢?    http事件处理器:那个谁,操作系统你过来一下,你把这些砖搬上车
  7. 操作系统写操作完成,通知事件分离器。                     操作系统:好的老大!                操作系统:报告!砖搬完了!
  8. 事件分离器把写操作完成事件报告给http事件处理器。             事件分离器:报告总指挥,货已经全部上车。       http事件处理器:不错,任务完成,又是忙碌的一天                 (操作系统:我有句。。。。不知当讲不当讲)

总结:和一般的异步操作不同。前摄器模式会把数据的读写这种比较耗时的动作交给操作系统去做(底层快啊),而自身只关心操作系统返回的读写完成通知,自身做一些解析就好了,这样就把事件处理和文件操作分离开了(这就是事件处理器的工作)。

到这里, 前摄器模式就讲的差不多啦,其实我一开始也不是很懂这个模式,于是把这个尽量整理成比较好懂的方式,可能有不恰当或者理解错误的地方,希望大家能帮我指出来,我进行改正

参考资料:http://www.kuqin.com/ace-2002-12/Part-One/Chapter-8.htm

时间: 2024-08-02 23:56:50

设计模式-前摄器模式(Proactor)的相关文章

asio的前摄器模式

设计模式-前摄器模式(Proactor 先来一段关于前摄器模式的官话:前摄器模式支持多个事件处理器的多路分离和分派,这些处理器由异步事件的完成来触发.通过集成完成事件(completion event)的多路分离和相应的事件处理器的分派,该模式简化了异步应用的开发. 简单点说,前摄器的实现多亏了多个事件处理器将事件和处理分离开,和处理方式的分派.而这些事件处理器的的触发方式是当被异步事件(仅限完成事件)通知而出发的.把这些个东西搞在一起就是前摄器模式了. 前摄器(proactor)模式 前摄器模

课二:前摄器设计模式(不使用多线程并发)

Asio库为同步和异步提供一一对应的操作.异步支持是基于前摄器设计模式.该模式的优势和劣势将在下面说明,与之对应的是反射器模式,该模式是一种同步模式. 前摄器的实现: 在Asio库中,前摄器的实现方式如下,该实现方式跨平台一致. 前摄器设计模式: 一.异步操作 定义一个异步执行的操作,例如在一个套接字上进行异步的读写. 二.异步操作处理 执行异步操作并当操作结束时,执行事件完成队列上的某个事件.从更高的层次看,如 stream_socket_service 这样的服务均是异步操作处理器. 三.事

java设计模式之 装饰器模式

适AT java设计模式之 装饰器模式 装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构. 这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,动态给一个对象添提供了额外的功能. 我们通过下面的实例来演示装饰器模式的用法.模拟一个人从想吃饭.找饭店.享受美食.结束吃饭的过程 代码展示: 首先创建一个被修饰的接口 Eat package deco

php设计模式之装饰器模式

1.介绍 1.装饰器模式(Decorator),可以动态地添加修改类的功能 2.一个类提供了一项功能,如果要在修改并添加额外的功能,传统的编程模式,需要写一个子类继承它,并重新实现类的方法 3.使用装饰器模式,仅需在运行时添加一个装饰器对象即可实现,可以实现最大的灵活性. 2.实例 接下来我们举一个例子,使用php实现一个小画板的功能(画指定颜色图形) 1.没使用装饰器之前的传统方式 1.实现一个画板的类 <?php class Canvas { //保存点阵的一个数组 public $data

python设计模式之装饰器模式

装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能. import time def log_calls(func): def wrapper(*args,**kwargs): now=time.time() print("Calling{0} with {1} and {2}

设计模式之: 装饰器模式

什么是装饰器模式 作为一种结构型模式, 装饰器(Decorator)模式就是对一个已有结构增加"装饰". 适配器模式, 是为现在有结构增加的是一个适配器类,.将一个类的接口,转换成客户期望的另外一个接口.适配器让原本接口不兼容的类可以很好的合作. 装饰器模式是将一个对象包装起来以增强新的行为和责任.装饰器也称为包装器(类似于适配器) 有些设计设计模式包含一个抽象类,而且该抽象类还继承了另一个抽象类,这种设计模式为数不多,而装饰器就是其中之一. 什么时候使用装饰器模式 基本说来, 如果想

设计模式之装饰器模式

一.百科 概述: 23种设计模式之一,英文叫Decorator Pattern,又叫装饰者模式.装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 特点: (1) 装饰对象和真实对象有相同的接口.这样客户端对象就能以和真实对象相同的方式和装饰对象交互. (2) 装饰对象包含一个真实对象的引用(reference) (3) 装饰对象接受所有来自客户端的请求.它把这些请求转发给真实的对象. (4) 装饰对象可以在转发这些请

五分钟一个设计模式之装饰器模式

五分钟一个设计模式,用最简单的方法来描述设计模式.查看更多设计模式,请点击五分钟一个设计模式系列 http://blog.csdn.net/daguanjia11/article/category/3259443 示例代码 今天实在是想不出什么开场白来引出示例了,也想不出特别有意思的示例了,就用一个很土的例子来描述一下装饰器模式吧. 每个人都要穿衣服,每件衣服都具有某些特定的功能,例如,穿上鞋子的话走路舒服,穿上上衣的话上身不冷,穿上裤子的话腿不冷(你这不废话吗).也就是说,每件衣服都具有特定的

23种设计模式之装饰器模式(Decorator Pattern)

装饰器模式(Decorator Pattern) 允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能. 通过采用组合.而非继承的手法,Decorator模式实现了在运行时动态地扩展对象功能的能力,而且可以根据需要扩展多个功能.避免了单独使用继承带来的“灵活性差"和"多子类衍生问题". 优点:装饰类和被装饰类可以独立发