Reactor pattern

什么是Reactor

Reactor又称Dispatcher,用于同步IO,它逆置了常见的函数调用机制,也就是说, Application将一个service对应的handler注册到Reactor,当这个service需要被处理时(一般通过定时器来触发),Reactor主动调用handler.浅白一点说, ‘Don’t call us, we’ll call you.’ — Hollywood principle.

在前面对Reactor的简单解释中,可以看到Reactor至少有下面几个组件:

  1. handle: service(read, write)对应的句柄,Linux下通常是file description.
  2. handler: service对应的回调函数,如 handle_read(), handle_write().
  3. demultiplexer: 多路复用机制,Linux下可以用select/(e)poll
  4. reactor: 注册/移除handler的统一界面,如: Reactor::register_handler(), Reactor::remove_handler().

废话少说,看一下Reactor pattern大概的样子:

01. int fd[MAX_FD]; //要素1
02.   
03. typedef int EventType;
04. typedef int HANDLER;
05.   
06. enum
07. {
08.     READ_EVENT = 1;
09.     WRITE_EVENT = 2;
10.     ...
11. };
12.   
13. class CEventHandler //要素2
14. {
15. public:
16.     virtual void handle_read(HANDLER handle) = 0;
17.     virtual void handle_write(HANDLER handle) = 0;
18.     virtual HANDLER get_handle() const = 0;
19.     ...
20. };
21.   
22. class CReactor //要素4
23. {
24. public:
25.     virtual void register_handler(HANDLER handle, CEventHandler *ceh, EventType et) = 0;
26.     virtual void remove_handler(HANDLER handle, CEventHandler *ceh, EventType et) = 0;
27.     void handle_events(struct timeval *tv);
28.     ...
29. };

thttpd的Reactor pattern

thttpd是事件驱动(event-driven)的,它有效的避开了多线程附带的复杂不易维护(尤其是临界区)和上下文切换,将CPU从事件源中解放出来,无须block.关于Event driven,这里不多说.

现在看看thttpd很寒酸的Reactor pattern:

thttpd自身既是master,又是worker,matser代码是main(), worker代码是handle_read(),handle_write()等函数.thttpd使用Reactor pattern,但弃用了Reactor 要素4的reactor,也就是说,代码中根本就没有CReactor界面,这直接导致了要素2被散乱的硬编码到thttpd.c文件中,无需注册,也没有办法移除.对于thttpd这种HTTP服务器来说,要素1很自然的就是fd,而要素3 demultiplexer,在我的电脑上,configure thttpd代码时被选定为select.

以上,确实很粗略,哈哈哈. 其实thttpd里面有很多不错的小技巧,比如说watchdog,总结出来应该是很实用的 :p

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值