设计模式-前摄器模式(Proactor)
本周要进行boost asio库的学习,在学习之前发现最好需要先了解一下前摄器模式,这样对asio库的理解很有帮助,故写下此文
我之前写的随笔XShell的模拟实现中的链接方式可以说是同步的(服务器阻塞等待链接),这样当有服务器端在等待链接的时候就浪费了大量的资源,我们可以让服务器异步等待客户端的链接,服务器在等待链接的同时可以做别的事情,等到客户端链接请求到来的时候,调用一个回调执行链接,这就很灵活。
先来一段关于前摄器模式的官话:前摄器模式支持多个事件处理器的多路分离和分派,这些处理器由异步事件的完成来触发。通过集成完成事件(completion event)的多路分离和相应的事件处理器的分派,该模式简化了异步应用的开发。
简单点说,前摄器的实现多亏了多个事件处理器将事件和处理分离开,和处理方式的分派。而这些事件处理器的的触发方式是当被异步事件(仅限完成事件)通知而出发的。把这些个东西搞在一起就是前摄器模式了。
- 前摄器(proactor)模式
前摄器模式主要利用操作系统的异步操作特性(如果操作系统不支持异步的话前摄器模式就。。。),简单的说,当你想到异步的时候第一反应一般就是select,poll和epoll这几个函数吧(或者是类似Qt的消息和槽函数之类的),当你的select函数捕捉到一个请求的时候,就执行一个操作(例如传输一个小视频),不过这一般都是在编写的应用程序中实现的,前摄器和这个方式不同的地方就是,它可以让别人帮他干搬砖的活,当浏览器请求一个文件,事件处理器就会把这个请求告诉操作系统,让操作系统去办,而事件处理器本身只关注操作系统发送回来的完成事件,事件处理器收到完成事件就拿操作系统搬好的砖,交给工头,任务就算完成了。下面对连接请求和文件请求两个操作进行图片详解~

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

- 某用户通过浏览器想要下载小视频,于是就上网下
- 模范劳工操作系统把请求数据放在缓冲区中 操作系统:报告老大,搬完了
- 事件分离器把事件完成告诉事件处理器 小工头事件分离器:操作系统你干的不错,但是你的功劳是我的了
- http事件处理器解析缓冲区中保存的请求数据,发现居然有人要下小视频
- http事件处理器只能悲催的去文件系统中同步的读文件
- 但是读完的数据要放在socket连接上,往这上写又耗时又费力,能不能找个老实人帮我干呢? http事件处理器:那个谁,操作系统你过来一下,你把这些砖搬上车
- 操作系统写操作完成,通知事件分离器。 操作系统:好的老大! 操作系统:报告!砖搬完了!
- 事件分离器把写操作完成事件报告给http事件处理器。 事件分离器:报告总指挥,货已经全部上车。 http事件处理器:不错,任务完成,又是忙碌的一天 (操作系统:我有句。。。。不知当讲不当讲)
总结:和一般的异步操作不同。前摄器模式会把数据的读写这种比较耗时的动作交给操作系统去做(底层快啊),而自身只关心操作系统返回的读写完成通知,自身做一些解析就好了,这样就把事件处理和文件操作分离开了(这就是事件处理器的工作)。
到这里, 前摄器模式就讲的差不多啦,其实我一开始也不是很懂这个模式,于是把这个尽量整理成比较好懂的方式,可能有不恰当或者理解错误的地方,希望大家能帮我指出来,我进行改正
设计模式-前摄器模式(Proactor)的更多相关文章
- 【转】第8章 前摄器(Proactor):用于为异步事件多路分离和分派处理器的对象行为模式
目录: Reactor(反应堆)和Proactor(前摄器) <I/O模型之三:两种高性能 I/O 设计模式 Reactor 和 Proactor> <[转]第8章 前摄器(Proa ...
- ACE前摄器Proactor模式
转载于:http://www.cnblogs.com/TianFang/archive/2006/12/31/608952.html 当 OS 平台支持异步操作时,一种高效而方便的实现高性能 Web ...
- python设计模式之修饰器模式
python设计模式之修饰器模式 无论何时我们想对一个对象添加额外的功能,都有下面这些不同的可选方法. [ ] 如果合理,可以直接将功能添加到对象所属的类(例如,添加一个新的方法) [ ] 使用组合 ...
- python 设计模式之装饰器模式 Decorator Pattern
#写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...
- PHP设计模式之装饰器模式(Decorator)
PHP设计模式之装饰器模式(Decorator) 装饰器模式 装饰器模式允许我们给一个类添加新的功能,而不改变其原有的结构.这种类型的类属于结构类,它是作为现有的类的一个包装 装饰器模式的应用场景 当 ...
- Java设计模式07:常用设计模式之装饰器模式(结构型模式)
1. Java之装饰器模式(Decorator Pattern) (1)概述: 装饰模式在Java种使用也很广泛,比如我们在重新定义按钮.对话框等时候,实际上已经在使用装饰模式了.在不必改变原 ...
- python设计模式之装饰器模式
装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰 ...
- PHP设计模式之装饰器模式
装饰器模式:如果已有对象的部分内容或功能性发生改变,但是不需要修改原始对象的结构或不使用继承,动态的扩展一个对象的功能,则应该使用装饰器模式.简单点说:就是我们不应该去修改已有的类,而是通过创建另外一 ...
- java设计模式之 装饰器模式
装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构. 这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装 ...
随机推荐
- [图形学] 计算机图形学 with OpenGL开篇
<计算机图形学>(第四版)正在学习中,学习目的是为了在Unity中使用shader实现不同的渲染效果. 希望在这里能把学习过程中学到的知识和遇到的问题记录下来. 工作环境是:Xcode 8 ...
- 使用Webpack加速Vue.js应用的4种方式
Webpack是开发Vue.js单页应用程序的重要工具. 通过管理复杂的构建步骤,你可以更轻松地开发工作流程,并优化应用程序的大小和性能. 其中介绍下面四种方式: 单个文件组件 优化Vue构建 浏览器 ...
- Mac之OS系统下搭建JavaEE环境 <二> 之Tomcat 的安装配置
二.Tomcat的安装与配置 1.下载Tomcat 找到Tomcat的官网 百度搜索Tomcat 点击下载即可 下载网址:http://tomcat.apache.org/download-80.cg ...
- 动态绑定DropDownList
1.首先前台创建一个dropdownlist控件,并为这个控件起名id ,并且不要忘记runat=server这个属性,否则后台不能获取到该控件. 2.后台自定义方法绑定控件(本方法以三层架构的写法为 ...
- [CF161D]Distance in Tree-树状dp
Problem Distance in tree 题目大意 给出一棵树,求这棵树上有多少个最短距离为k的点对. Solution 这个题目可以用点分治来做,然而我到现在还是没有学会点分治,所以只好用树 ...
- 面向对象15.2String类-构造函数
public class String_Constructor { //快捷键小方法: Ctrl+d,删除整行,选中几行删除几行 public static void main(String[] ar ...
- 2-用EasyNetQ连接RabbitMQ(黄亮翻译)
如果你连接过关系数据库,例如SQL Server.你会发现EasyNetQ处理connections有点奇怪.和关系数据库通讯一直都是通过client开始的.Client 打开一个连接, 发出一个SQ ...
- Redis 错误1067:进程意外终止,Redis不能启动,Redis启动不了
Redis 错误1067:进程意外终止,Redis不能启动,Redis启动不了 >>>>>>>>>>>>>>> ...
- Spring 自定义注解,配置简单日志注解
java在jdk1.5中引入了注解,spring框架也正好把java注解发挥得淋漓尽致. 下面会讲解Spring中自定义注解的简单流程,其中会涉及到spring框架中的AOP(面向切面编程)相关概念. ...
- ps_cc切片
web前端开发的工作流程的第一步就是根据ui给的psd来还原设计图样貌. 可是一打开满屏的参考线.这时我们可以alt+v+d清空参考线 这时可以按alt+鼠标拖放图片.同时也可以按F进入半屏和匀速连按 ...