从应用层次探讨Reactor

前端之家收集整理的这篇文章主要介绍了从应用层次探讨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相关文章