首页 > 代码库 > I/O并发模式—Reactor模式

I/O并发模式—Reactor模式

好莱坞原则是“不要打电话给我们,我们会打电话通知你”,其实Reactor模式就是如此,你不必一直询问某个事件是否发生了,当事件发生时,会主动通知你。一般用于服务器并发的处理请求。先来看几个Reactor模式中的参与者。

  • 事件处理器:对应一个描述符,实现了应用程序在该描述符上提供的服务。
  • Reactor管理器:是事件处理器的调度核心。用于控制事件调度,以及应用程序注册、删除事件处理器和相关的描述符。Reactor管理器使用同步事件分离器来等待事件的发生。
  • 同步事件分离器(demultiplexer):用来等待一个或多个事件的发生,调用者会被阻塞,直到分离器分离的描述符集上有事件发生。如Linux中的select,就是一个分离器。
应用程序要做的,仅仅是实现一个事件处理器,然后把它注册到Reactor管理器中,接下来的事件调度工作就交由管理器来完成。
Reactor管理器肩负着事件的分离和调度,是整个框架设计的核心。设想一个多用户并发访问的例子,来体验一下Reactor的作用。
现在餐厅同时到了五组客人,传统的线程池做法是,为每组客人(请求)分配一个服务员(线程)。Reactor的做法是,服务员Tom先去招呼A组客人,让A组客人慢慢看菜谱点菜,然后再去招呼B组,依次下去,当A组点好了菜,会直接招呼服务员"点好了",这时Tom再去招呼A组客人,为A组客人录入菜单。这样会大大提高餐厅的效率,节省人力。
如果这是一台服务器在并发处理客户请求,一请求一线程,看似合理,却要消耗很多系统资源。但如果这些客户请求并不要求服务器一直处理,也就是有I/O事件(服务器在接受客户端A请求后,通过它们之间的socket开始读A发送的数据),这时相应的服务器线程就可以抽身去处理其他请求,但完成A的读取后会通知服务器继续处理客户端A的请求。这就需要一套库来帮助服务器程序完成这些调度,服务器程序只需提供当请求来临,I/O事件发生时的处理函数即可,那些如何为并发请求访问分配线程和线程调度,以及何时调用服务器程序准备的处理函数的问题都交由那套库来处理。
总之,Reactor就是当I/O事件发生时会主动通知你,你就不必一直守着直到该事件发生,还是抽身去多干点其他的事吧。

I/O并发模式—Reactor模式