Reactor(反应器)/Proactor(前摄器)是多路复用方案之一,有点像观察者模式,都是通过注册然后等待通知的方式处理事件,
区别在于,观察者将自己直接注册到被观察对象上,而Reactor模式是将观察者注册到公共对象
上,通过公共对象
去监听被观察对象发出的事件。

- Handel被监听对象们
- Synchronous Event Demultiplexer会主动去轮询Handle,看是否有准备就绪的
事件
- Initiation Dispatcher如果有准备就绪事件,就通过这个将事件发给Event Handler
- Event Handler
事件
处理程序接口 - Concrete Event Handler
事件
处理程序实现
Reactor的核心思想就是,将监听事件就绪的行为放到一个Reactor线程去处理,Reactor线程是阻塞的,其他线程可以从IO中解放。
缺点
- 在一个Reactor线程上,一个事件处理太久,会阻塞后面的事件处理
- 阻塞在select()上,不是AIO
Reactor是在事件准备就绪时通知Event Handler,所以Handler得到消息后,还需要去读写数据;Proactor是在IO数据准备就绪时通知Event Handler,所以Handler在接收到消息后,就能直接处理数据。
这么看,Reactor像一个廉价保姆,她会提醒你该吃饭了,但并不不会帮你做好饭;Proactor是个高级保姆,她会按照你的要求,把饭做完再通知你该吃饭了。主要区别是,在通知你的时候,饭是不是已经做好了。
自然廉价保姆功能比较简单,高级保姆功能更先进点,先进的代价就是要付出更多的酬劳(系统支持该特性)
流程区别
Reactor
- 注册监听(用户)
- 事件就绪(Reactor)
- 读取IO数据(用户)
- 处理数据(用户)
Proactor
- 注册监听(用户)
- 事件就绪(Proactor)
- 读取IO数据(Proactor)
- 处理数据(用户)
可以看出他们主要区别在,读取IO是交个谁来做,或者说用户得到通知的时候数据是否就绪了。
网友评论