java reactor设计模式_reactor设计模式

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

}

f6bbde2e11b44ea159471f1febd6ce9e.png

085eb8fb82347429f9794162b9d54d80.png

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为存储过程 ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值