Reactor 和 Proactor 是基于事件驱动,在网络编程中经常用到两种设计模式。
曾经在一个项目中用到了网络库 libevent,也学习了一段时间,其内部实现所用到的就是 Reactor,所知道的还有 ACE;Proactor 模式的库有 Boost.Asio,ACE,暂时没有用过。但我也翻阅了一些文档,理解了它的实现方法。下面是我在学习这两种设计模式过程的笔记。
Reactor
Reactor,即反应堆。Reactor 的一般工作过程是首先在 Reactor中注册(Reactor)感兴趣事件,并在注册时候指定某个已定义的回调函数(callback);当客户端发送请求时,在 Reactor中会触发刚才注册的事件,并调用对应的处理函数。在这一个处理回调函数中,一般会有数据接收、处理、回复请求等操作。
libevent 采用的就是 Reactor的设计思想。其 Reactor的中心思想是众所周知的 I/O 多路复用:select,poll,epoll,kqueue 等.libevent 精彩的将定时事件,信号处理,I/O 事件结合在在一起,也就是说用户同时在 Reactor中注册上述三类事件。遗憾的是,libevent 不支持多线程,也就是说它同步处理请求,导致不能处理大量的请求;这样并不是说 Reactor实现的网络库都不支持多线程,而是 libevent 本身的原因,我们也可以通过修改让 ilbevent 支持多线程,并发处理多个请求。
下面是 libevent 的一段代码,大概能够说明 Reactor工作模式:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
/*accept callback function.*/
void
accept_callback(
int
fd,
short
ev,
void
*arg)
{
......
}
......
struct
event accept_event;
event_set(&accept_event,
socketlisten,
EV_READ|EV_PERSIST,
accept_callback,
NULL);
event_add(&accept_event,
NULL);
event_dispatch();
|