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