微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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,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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如果组件之中有复用的代码,需要重新创建一个父类,父类中存储公共代码,返回子类,同时把公用属性...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例如我们的 setState 函数式同步执行的,我们的事件处理直接绑定在了 dom 元素上,这些都跟 re...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom 转为真实 dom 进行挂载。其实函数是组件和类组件也是在这个基础上包裹了一层,一个是调...
react 本身提供了克隆组件的方法,但是平时开发中可能很少使用,可能是不了解。我公司的项目就没有使用,但是在很多三方库中都有使用。本小节我们来学习下如果使用该...
mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接触 react 就一直使用 mobx 库,上手简单不复杂。
我们在平常的开发中不可避免的会有很多列表渲染逻辑,在 pc 端可以使用分页进行渲染数限制,在移动端可以使用下拉加载更多。但是对于大量的列表渲染,特别像有实时数据...
本小节开始前,我们先答复下一个同学的问题。上一小节发布后,有小伙伴后台来信问到:‘小编你只讲了类组件中怎么使用 ref,那在函数式组件中怎么使用呢?’。确实我们...
上一小节我们了解了固定高度的滚动列表实现,因为是固定高度所以容器总高度和每个元素的 size、offset 很容易得到,这种场景也适合我们常见的大部分场景,例如...
上一小节我们处理了 setState 的批量更新机制,但是我们有两个遗漏点,一个是源码中的 setState 可以传入函数,同时 setState 可以传入第二...
我们知道 react 进行页面渲染或者刷新的时候,会从根节点到子节点全部执行一遍,即使子组件中没有状态的改变,也会执行。这就造成了性能不必要的浪费。之前我们了解...