文档章节

Reactor反应器模式

一个小妞
 一个小妞
发布于 2017/09/07 10:56
字数 1049
阅读 47
收藏 1

1.模式介绍

在普通的事件处理机制:首先程序调用某个函数,然后函数执行,程序等待,当函数执行完毕后函数将结果和控制权返回给程序,最后程序继续处理。

Reactor模式的事件处理方式:我们可以将整个问题抽象。每个需要处理的事件就是一个事件源,每一个需要处理的事件接收到数据后的进一步处理操作作为一个事件处理器。我们将需要被处理的事件处理源及其事件处理器注册到一个类似于epoll的事件分离器中。事件分离器负责等待事件发生。一旦某个事件发送,事件分离器就将该事件传递给该事件注册的对应的处理器,最后由处理器负责完成事件的具体响应。

在Reactor模式中,应用程序不是主动的调用某个API完成处理,而是逆置了事件处理流程,应用程序需要提供相应的事件接口并注册到Reactor上,如果相应的事件发生,Reactor将主动调用应用程序注册的接口,通过注册的接口完成具体的事件处理。

2.模式组成

Reactor模式由事件源、事件反应器、事件分离器、事件处理器等组件组成。

事件源(handle):由操作系统提供,用于识别每一个事件,如Socket描述符、文件描述符等。在服务端系统中用一个整数表示。该事件可能来自外部,如来自客户端的连接请求、数据等。也可能来自内部,如定时器事件。
事件反应器(reactor):定义和应用程序控制事件调度,以及应用程序注册、删除事件处理器和相关描述符相关的接口。它是事件处理器的调度核心,使用事件分离器来等待事件的发生。一旦事件发生,反应器先是分离每个事件,然后调度具体事件的事件处理器中的回调函数处理事件。
事件分离器(demultiplexer):是一个有操作系统提供的I/O复用函数,在此我们选用epoll。用来等待一个或多个事件的发生。调用者将会被阻塞,直到分离器分离的描述符集上有事件发生。
事件处理器(even handler):事件处理程序提供了一组接口,每个接口对应了一种类型的事件,供reactor在相应的事件发生时调用,执行相应的事件处理。一般每个具体的事件处理器总是会绑定一个有效的描述符句柄,用来识别事件和服务。

3.处理流程

分为两个部分,事件注册部分和事件分发部分 ;

在事件注册部分,应用程序首先将期待注册的套接字描述符作为事件源,并将描述符和该事件对应的事件处理回调函数封装到具体的事件处理器中,并将该事件处理器注册到事件反应器中。事件反应器接收到事件后,进行相应处理,并将注册信息再次注册到事件分离器epoll中。最后在epoll分离器中,通过epoll_ctl进行添加描述符及其事件,并层层返回注册结果。

在事件处理部分,首先事件反应器通过调用事件分离器的epoll_wait,使线程阻塞等待注册事件发生。此时如果某注册事件发生,epoll_wait将会返回,并将包含该注册事件在内的事件集返回给事件反应器。反应器接收到该事件后,根据该事件源找到该事件的事件处理器,并判断事件类型,根据事件类型在该事件处理器调用之前注册时封装的具体回调函数,在这个具体回调函数中完成事件处理。

© 著作权归作者所有

共有 人打赏支持
一个小妞
粉丝 18
博文 170
码字总数 115462
作品 0
海淀
程序员

暂无文章

根据进程名称杀死进程

ps -ef | grep keyword | grep -v grep | awk '{print $2}' | xargs kill -9 逐个分析: 1, ps -ef | grep keyword: 查出进程名含有 keyword 的所有进程; 2, grep -v grep: 从这些结果里面,把......

vinci321
42分钟前
1
0
nginx的简单使用:负载均衡

nginx:反向代理的服务器;用户发送请求到nginx,nginx把请求发送给真正的服务器,等待服务器处理完数据并返回,再把数据发送给用户。 nginx作为一个反向代理服务器,能缓存我们项目的静态文...

osliang
58分钟前
2
0
网站title标题被改并被百度网址安全中心提醒的解决办法

国庆假日期间我们Sine安全接到众多网站站长求助网站标题被改导致在百度搜索中百度安全中心提醒被拦截,导致网站正常用户无法浏览网站被跳转到一些菠菜du博网站,而且很明显的一个特征就是在百...

网站安全
今天
1
0
JDK版本与major.minor version的对照关系

其实,只需要记住jdk6对于major.minor version 50即可,其他版本自行计算即可。 ---------------------

码代码的小司机
今天
1
0
C++基础教程面向对象学习笔记及心得感悟[图]

C++基础教程面向对象学习笔记及心得感悟[图] 使用友元函数重载算术运算符: C ++中一些最常用的运算符是算术运算符 - 即加号运算符(+),减运算符( - ),乘法运算符(*)和除法运算符(/...

原创小博客
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部