社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
由于 l i b e v e n t libevent libevent本身就是一个 R e a c t o r Reactor Reactor,所以了解 R e a c t o r Reactor Reactor这样一个应用于服务端的开发设计模式很有必要。
1. R e a c t o r Reactor Reactor模式
借由 W i k i p e d i a Wikipedia Wikipedia上的解释:
"The reactor design pattern is an event handling pattern for handling service requests delivered concurrently by one or more inputs. The service handler then demultiplexes the incoming requests and dispatches them synchronously to associated request handlers."
从这个描述中我们能了解到 R e a c t o r Reactor Reactor模式是事件驱动的,有一个或多个并发输入源,有一个 S e r v i c e Service Service H a n d l e r Handler Handler,有多个 R e q u e s t Request Request H a n d l e r Handler Handler;这个 S e r v i c e Service Service H a n d l e r Handler Handler会同步的将输入的请求( E v e n t Event Event)多路复用的分发给相应的 R e q u e s t Request Request H a n d l e r Handler Handler。
2. R e a c t o r Reactor Reactor模式的事件处理机制
不同于普通的函数调用,应用程序不是主动的调用某个 A P I API API完成处理,恰恰相反; R e a c t o r Reactor Reactor 逆置了事件处理流程,应用程序需要提供相应的接口并注册到 R e a c t o r Reactor Reactor 上,如果相应的事件发生, R e a c t o r Reactor Reactor 将主动调用应用程序注册的接口,这些接口又称为 C a l l b a c k Callback Callback函数(回调函数)。使用 l i b e v e n t libevent libevent 也是想 l i b e v e n t libevent libevent 框架注册相应的事件和回调函数;当这些事件发生时, l i b e v e n t libevent libevent 会调用这些回调函数处理相应的事件( I / O I/O I/O 读写、定时和信号)。
3.
R
e
a
c
t
o
r
Reactor
Reactor模式具备的优点
R
e
a
c
t
o
r
Reactor
Reactor 模式是编写高性能网络服务器的必备技术之一,它具有如下的优点:
4. R e a c t o r Reactor Reactor模式框架
使用 R e a c t o r Reactor Reactor模型必备的几个组件:事件源、 R e a c t o r Reactor Reactor框架、多路复用机制以及事件处理机制,如下图:
(一)事件源
L
i
n
u
x
Linux
Linux 上是文件描述符,
W
i
n
d
o
w
s
Windows
Windows 上就是
S
o
c
k
e
t
Socket
Socket 或者
H
a
n
d
l
e
Handle
Handle 了,这里统一称为“句柄 集”;程序在指定的句柄上注册关心的事件,比如
I
/
O
I/O
I/O 事件。
(二)
e
v
e
n
t
event
event
d
e
m
u
l
t
i
p
l
e
x
e
r
demultiplexer
demultiplexer——事件多路分发机制
由操作系统提供的
I
/
0
I/0
I/0多路复用机制,比如
s
e
l
e
c
t
select
select、
p
o
l
l
以
及
e
p
o
l
l
poll以及epoll
poll以及epoll。
对应到 l i b e v e n t libevent libevent 中,依然是 s e l e c t select select、 p o l l poll poll、 e p o l l epoll epoll 等,但是 l i b e v e n t libevent libevent 使用结构体 e v e n t o p eventop eventop 进行了封装,以统一的接口来支持这些 I / O I/O I/O 多路复用机制,达到了对外隐藏底层系统机制的目的。
(三)
R
e
a
c
t
o
r
Reactor
Reactor–反应器
R
e
a
c
t
o
r
Reactor
Reactor,事件处理的接口。内部使用
e
v
e
n
t
event
event
d
e
m
u
l
t
i
p
l
e
x
e
r
demultiplexer
demultiplexer进行注册、注销事件;并运行事件循环;当有事件准备就绪,调用注册事件的回调函数处理事件。
对应到 l i b e v e n t libevent libevent,就是 e v e n t event event_ b a s e base base结构体。
常用的 R e a c t o r Reactor Reactor声明:
class Reactor {
public:
int register_handler(Event_Handler *pHandler, int event);
int remove_handler(Event_Handler *pHandler, int event);
void handle_events(timeval *ptv);
// ...
};
(四)
E
v
e
n
t
Event
Event
H
a
n
d
l
e
Handle
Handle—事件处理程序
事件处理程序提供了一组接口,分别对应于不同类型的事件;当有事件发生时,
R
e
a
c
t
o
r
Reactor
Reactor调用相应的事件处理函数,通常会绑定一个有效的句柄。
对应到 l i b e v e n t libevent libevent,就是 e v e n t event event结构体。
常用的 E v e n t Event Event H a n d l e Handle Handle声明:
class Event_Handle{
public:
virtual void handle_read() = 0;
virtual void handle_write() = 0;
virtual void handle_timeout() = 0;
virtual void handle_close() = 0;
virtual HANDLE get_handle() = 0;
// ...
};
class Event_Handle{
public:
// events maybe read/write/timeout/close .etc
virtual void handle_events(int events) = 0;
virtual HANDLE get_handle() = 0;
// ...
};
5.
R
e
a
c
t
o
r
Reactor
Reactor事件处理流程
如下图:
6.与
P
r
o
a
c
t
o
r
Proactor
Proac
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_38790716/article/details/96316163
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!