冒号课堂§3.4:事件驱动 - 编程入门网
性就很强,知道为什么吗?”
逗号随口说道:“不是因为利用回调函数实现了控制反转吗?” “非也非也。”冒号文绉绉地说,“软件的可伸缩性(scalability)一般指应对工作量增长的能力,多出于性能方面的考量。而控制反转的主要作用是降低模块之间的依赖性,从而降低模块的耦合度和复杂度,提高软件的可重用性、柔韧性和可扩展性,但对可伸缩性并无太大帮助。我们已经看到,控制反转导致了事件驱动式编程的被动性(passivity)。此外,事件驱动式还具有异步性(asynchrony)的特征,这是由事件的不可预测性与随机性决定的。如果一个应用中存在一些该类特质的因素,比如频繁出现堵塞呼叫(blocking call),不妨考虑将其包装为事件。” 问号打岔道:“什么是堵塞呼叫?” 冒号作了个比方:“在高速公路上一辆车突然出故障停在路途,急调维修人员。如果现场修理,在修好之前所在车道是堵塞的,后面车辆无法通行。类似地,在程序中一些函数需要等待某些数据而不能立即返回[6],从而堵塞整个进程。” 引号道出常识:“显然更可取的修车做法是:先把车拖到路边,修完后向其他车辆发出信号,以便重回车道。” 冒号趁热打铁:“同理,我们可以让堵塞呼叫暂时脱离主进程,事成之后再利用事件机制申请重返原进程。相比第一种同步流程式的方案,这种异步事件式将连续的进程中独立且耗时的部分抽取出来,从而减少随机因素造成的资源浪费,提高系统的性能和可伸缩性。” 问号听得仔细:“为什么抽取的部分是‘独立且耗时’,而不是‘随机且耗时’?” “问得好!”冒号很欣赏他严谨的学风,“再拿修车来说,第二种方案之所以可行有两方面原因:一是修车耗时,二是修车独立。所谓独立又有两层含义:与车道独立——修车时不必占用车道;与后车独立——后面车辆不必恭候该车。如果一分钟内能修好,或者路边没有足够空位,再或者后面车辆是故障车的随行车,那么拖车方案均不成立。大家可以自己类比堵塞呼叫的情形,我就不再饶舌了。总之,独立是异步的前提,耗时是异步的理由。至于随机嘛,只是副产品,一个独立且耗时的子过程,通常结束时间也是不可预期的。” 冒号课堂§3.4:事件驱动(7)时间:2011-06-25 BlogJava xyz98眼见天色已晚,冒号赶忙换上最后一页幻灯片—— “上图为一个典型的事件驱动式模型。事件处理器事先在关注的事件源上注册,后者不定期地发表事件对象,经过事件管理器的转化(translate)、合并(coalesce)、排队(enqueue)、分派(dispatch)等集中处理后,事件处理器接收到事件并对其进行相应处理。请注意事件处理器随时可以注册或注销事件源,意味着二者之间的关系是动态建立和解除的。”冒号在幻灯屏上指指点点,“通过事件机制,事件源与事件处理器之间建立了松耦合的多对多关系:一个事件源可以有多个处理器,一个处理器可以监听多个事件源。再换个角度,把事件处理器视为服务方,事件源视为客户方,便是一个client-server模式。每个服务方与其客户方之间的会话(session)是异步的,即在处理完一个客户的请求后不必等待下一请求,随时可切换(switch)到对其他客户的服务。更有甚者,事件处理器也能产生事件,实现处理器接口的事件源也能处理事件,它们可以角色换位,于是又演化为peer-to-peer模式。” 叹号抱怨:“有点眼花缭乱了。” 为湿润枯燥的理论,冒号再次举例:“你们不是很喜欢在QQ上聊天吗?QQ服务器是事件管理器,每个聊天者既是事件源又是事件处理器,这正是事件驱动式的P2P模 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |