“反应器模式”及其应用的简单说明


88

Wikipedia中对Reactor模式进行了说明,它有点抽象。您可以更具体地描述这种模式吗?理想情况下,使用代码片段或描述反应堆模式某些应用程序的高级类图。


3
发现这个问题是一个伟大的答案- stackoverflow.com/questions/9138294/...
瑞恩·吉本斯

Answers:


37

您可能需要查看描述它的原始文章,网址为http://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf

Reactor设计模式处理由一个或多个客户端同时交付给应用程序的服务请求。应用程序中的每个服务都可以由服务器方法组成,并由负责分派特定于服务的请求的单独事件处理程序表示。事件处理程序的调度由初始化调度程序执行,该调度程序管理已注册的事件处理程序。服务请求的多路分解由同步事件多路分解器执行。


正如您在阅读文章时会注意到的那样,Douglas Schmidt等人实现了一个称为Adaptive Communications Environment的高效模块化C ++框架,其中Reactor模式扮演着中心角色。框架本身利用了过多的设计模式,因此值得一试。如果您寻找用于构建高度可扩展的C ++后端的可移植框架,那么ACE值得一看。
user2015735

1
@reese Link今天坏了,男人:(
艾伦·蔡


3
OP要求提供“简单,具体”的解释,而您提供的内容甚至比Wikipedia还要抽象...

22

反应器允许使用单个线程有效地处理阻塞(例如由于IO)的多个任务。反应堆管理处理程序池并运行事件循环。当调用它执行任务时,它将它与新的或闲置的处理程序链接起来,使其处于活动状态。事件循环(1)查找所有活动且未阻塞的处理程序(或将其委托给调度程序实现)(2)按顺序执行这些找到的处理程序,直到它们完成或到达阻塞点为止。已完成的处理程序将变为非活动状态且闲置以供重用,而被阻止的活动处理程序将屈服,从而允许事件循环继续进行。(3)从步骤(1)开始重复


1
下注,因为这是不正确的
-SebNag

3
核心思想是执行同步事件多路分解。仅当事件处理程序可以以非阻塞方式执行时才调用事件处理程序,例如,整个数据包在网络套接字上都可用,等待事件处理程序处理数据。这样就可以以非阻塞方式顺序执行事件处理程序
SebNag

2
“ Reactor模式负责多路事件处理程序的多路分解和分派,这些事件处理程序可以在不阻塞的情况下同步启动操作时触发。” 从被接受的答案中链接的文件
SebNag 18'Dec

这根本不是真的。非反应器中的螺纹数量与反应堆中的螺纹数量相同。除了事件循环,您还可以使用一个不使用观察者/事件侦听器模式的“驱动”线程。相同的性能。
僵尸
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.