reactor介绍
reactor的工作模式就像它的名字一样,是一种反射模式,当事件发生时,根据发生的事件调用注册的处理器。
Reactor的优点和应用
Reactor最常用于非阻塞的socket
传统的设计是一种同步的停等协议,读写操作执行后要等待当前fd的下一次可读/写事件,这期间什么都不能干,程序就阻塞在事件上。
有了Reactor以后的设计,告诉Reactor你所关注的事件和事件发生后的处理器,Reactor充当一个中间人的角色,非阻塞的检测事件是否发生,如果发生就调用注册的处理器。与传统设计不同的是Reactor可以同时非阻塞的检测多个I/O上的事件并处理,大大提高了程序运行效率。
以ev_io为例,说明reactor模式
初始化事件处理器
ev_io_init
注册事件处理器,把事件处理器添加到ev_loop的观察列表中
ev_io_start
移除事件处理器,把事件处理器从ev_loop的观察列表中移除
ev_io_stop
reactor主循环,I/O多路复用和事件分发器
ev_run
{
//检查关注fd列表fdchanges,新增加或者修改的fd都保存在这个列表中
//通过fd查找注册的事件处理器ANFD,检查事件处理器的关注事件
fd_reify
调用跨平台的多路复用api,封装过的,epoll的封装在ev_epoll.c
backend_poll
把事件加入待处理列表
ev_feed_event
//调用所有的待处理事件处理器
ev_invoke_pending
}
reactor模式的主要步骤:
1.client通过ev_io_init和ev_io_start接口把fd和事件处理器、套接字、关注的事件加入到reactor中
2.Reactor的主循环调用I/O多路复用API获取就绪事件,并把就绪事件添加到就绪列表中
3.事件分发器根据就绪列表中的fd,查找并调用client注册的事件处理器
浅析Reactor设计模式
简介:Reactor 设计模式是一种事件驱动的设计模式,将一个或者多个客户端请求分发到不同的处理器上,来提升事件处理的效率.主要的应用场景就是java NIO当中用户处理网络请求.使用的是异步非阻塞I ...
Java NIO 与 基于reactor设计模式的事件处理模型
Java NIO非堵塞应用通常适用用在I/O读写等方面,我们知道,系统运行的性能瓶颈通常在I/O读写,包括对端口和文件的操作上,过去,在打开一个I/O通道后,read()将一直等待在端口一边读取字节内 ...
SimpleRpc-网络事件响应Reactor设计模式
前言 这篇文章主要介绍整个框架用到的最核的一个设计模式:反应器模式.这个设计模式可以在中详细了解,没有这本书的小伙伴不要急,我通过咱们的SimpleRpc来告诉大家这 ...
I/O模型系列之四:两种高性能IO设计模式 Reactor 和 Proactor
不同的操作系统实现的io策略可能不一样,即使是同一个操作系统也可能存在多重io策略,常见如linux上的select,poll,epoll,面对这么多不同类型的io接口,这里需要一层抽象api来完成, ...
Reactor 反应堆设计模式
为了应对高并发的服务器端开发,微软在2009年提出了一种更优雅地实现异步编程的方式Reactive Programming即反应式编程.随后其他技术紧随其后,比如ES6通过引入类似的异步编程方式等. ...
笔记-reactor pattern
笔记-reactor pattern 1. reactor模式 1.1. 什么是reactor模式 The reactor design pattern is an event han ...
NIO和Reactor
本文参考Doug Lea的Scalable IO in Java. 网络服务 随着网络服务的越来越多,我们对网络服务的性能有了更高的要求,提供一个高性能,稳定的web服务是一件很麻烦的事情,所以有了n ...
POCO库中文编程参考指南(11)如何使用Reactor框架?
1 Reactor 框架概述 POCO 中的 Reactor 框架是基于 Reactor 设计模式进行设计的.其中由 Handler 将某 Socket 产生的事件,发送到指定的对象的方法上,作为回调 ...
高性能IO模型浅析
高性能IO模型浅析 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking ...
随机推荐
转: YAML 语言教程 from(阮一峰)
YAML 语言教程 from: http://www.ruanyifeng.com/blog/2016/07/yaml.html
Microsoft Visual Studio Professional 2012 专业版 下载
记录(以下内容来自网络收集): 下载地址: https://www.microsoft.com/zh-cn/download/details.aspx?id=30682 直接iso连接下载址: htt ...
SZU:J38 Number Base Conversion
Judge Info Memory Limit: 32768KB Case Time Limit: 1000MS Time Limit: 1000MS Judger: Number Only Judg ...
Another Array of Orz Pandas
Another Array of Orz Pandas 题目链接:http://acm.xidian.edu.cn/problem.php?id=1187 线段树 线段树维护区间和以及区间内各个数平方 ...
Java 非线程安全的HashMap如何在多线程中使用
Java 非线程安全的HashMap如何在多线程中使用 HashMap 是非线程安全的.在多线程条件下,容易导致死循环,具体表现为CPU使用率100%.因此多线程环境下保证 HashMap 的线程安全 ...
Python笔记(一)——打印输出
一.输出语句input 输出语句print 例:用户输入 username = input("username:") #变量名 显示的字符 password = input( ...
【手记】解决启动SQL Server Management Studio 17时报Cannot find one of more components...的问题
刚装好SSMS 17.1准备体验,弹出: 一番搜索,普遍办法都是安装VS2015独立shell.删除某个注册表项什么的,没用,首先这个shell我是装了的,然后也没有那个注册表项.我自己尝试过重装sh ...
你不知道的JavaScript(中卷) (Kyle Simpson 著)
第一部分 类型和语法 第1章 类型 1.1 类型 1.2 内置类型 1.3 值和类型 1.3.1 undefined和undeclared 1.3.2 typeof Undeclared 1.4 小结 ...
windows线程退出的方法
线程的handle用处: 线程的handle是指向“线程的内核对象”的,而不是指向线程本身.每个内核对象只是内核分配的一个内存块,并且只能由内核访问.该内存块是一种数据结构,它的成员负责维护对象的各种 ...
SQL Server 存储过程,带事务的存储过程(创建存储过程,删除存储过程,修改存储过
存储过程 创建存储过程 use pubs --pubs为数据库 go create procedure MyPRO --procedure为创建存储过程关键字,也可以简写proc,MyPRO为存储过程 ...