从应用层次探讨Reactor

操作系统已经提供了Reactor机制,核心表现是select方法。ACE的Reactor其实是对类select的操作系统方法的封装。   我这里都使用select方法举例讨论。   使用select方法,需要把socket压入FD_SET,使用select方法获取一次事件。在这个过程中,我们针对特定的事件进行反映,因此称为reactor。   ACE使用面对对象的思想对reactor进行了封装,对于一个事件句柄(Event_Handler)而言,它应该封装操作和数据(思考C++类的方法和数据),对于select方法而言,它接受socket句柄而不是Event_Handler,为了使用封装思想,应该在reactor中保存映射表,在register_hander时保存event_handler和socket的映射,把socket给select把event_handler给reactor。为了能够提取到event_handler中的socket handler,ACE规定了必须定义一个get_handle方法。   由以上分析得知,为了使用ACE::Reactor机制,我们应该继承ACE_Event_Handler,并且,get_handle方法是必须的,否则,Reactor无法获取handle注册,我们不能收到任何事件。   在register_handler时,需要通过特定的掩码注册特定事件,特定事件的方法应该被实现,当然,不实现也可以,只不过这样的话我们的event_handler没有任何使用意义。   额外收获,在实际使用Reactor框架进行网络编程的时候,周期性的时间事件往往对我们很有用(至少我经常用while-true-sleep方法为自己获得一个周期性的时间触发器),ACE的Reactor继承自ACE_Reactor_Timer_Interface类并实现了schedule_timer等方法,在我们的event_handler中,可以获得一次(注意是一次)到时通知(这相当于定了一个闹表),如果希望周期性获得通知,可以在每次到期的时候重新注册(重新定闹表)。   select方法可以获得一次事件,但实际使用中多数时候,我们需要使用select处理所有事件,这就需要使用循环处理select事件,Reactor理所当然的定义了run_reactor_event_loop系列方法。   在时间(ACE_Time_Value、ACE_Reactor_Timer_Interface)、事件(ACE_Event_Handler)、Reactor的支持下,我们可以高效的开发基于select的网络应用(对我来说,开发速度让我欣喜,当然,ACE的其他优点也很显著)。

相关文章

react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom...
react 本身提供了克隆组件的方法,但是平时开发中可能很少使...
mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接...
我们在平常的开发中不可避免的会有很多列表渲染逻辑,在 pc ...