使用反应器模式的简单解释及其应用

93

Reactor模式在维基百科中有解释,但它有点抽象。您能否用更具体的方式描述这种模式?最好使用代码片段或高级类图来描述一些Reactor模式的应用。


3
发现这个问题的答案很不错 - https://dev59.com/QWox5IYBdhLWcg3wi03F - Ryan Gibbons
2个回答

40

您可能需要查看描述此模式的原始论文http://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf

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


1
正如你在阅读文章时会注意到的,Douglas Schmidt等人实现了一个高效和模块化的C++框架,称为自适应通信环境(ACE),其中Reactor模式起着核心作用。该框架本身利用了众多的设计模式,值得单独研究。如果你正在寻找一个构建高度可扩展的C++后端的便携式框架,那么ACE值得一看。 - user2015735
1
@reese 今天链接坏了,伙计 :( - Allan Chua
1
@AllanChua 我想我找到了 - https://www.dre.vanderbilt.edu/~schmidt/PDF/Reactor.pdf - manish ma
15
OP要求“简单、具体”的解释,而你提供的东西甚至比维基百科还要抽象... - Zhe

23

反应器允许使用单个线程高效处理多个阻塞(例如由于IO)的任务。反应器管理一组处理程序并运行事件循环。当调用它执行一个任务时,它将其链接到一个新的或空闲的处理程序,使其变为活动状态。事件循环 (1) 查找所有处于活动且未阻塞的处理程序(或将此委托给调度程序实现)(2) 顺序执行每个已找到的处理程序,直到它们完成或达到阻塞点。已完成的处理程序变为非活动状态并空闲以备重用,而受阻的活动处理程序则会让出,允许事件循环继续。(3) 从步骤 (1) 重复。


1
因为这不正确,所以被踩了。 - clickMe
4
核心思想是进行同步事件多路复用。只有在事件处理程序可以以非阻塞的方式执行时,例如在网络套接字上整个数据包已经就绪等待事件处理程序来处理数据时,才会调用事件处理程序。这使得可以以非阻塞的方式按顺序执行事件处理程序。 - clickMe
2
反应器模式负责多路复用和分派多个事件处理程序,当可以同步启动操作而不阻塞时触发这些处理程序。 - clickMe
这完全不是真的。非反应器中的线程数量与反应器模式中的线程数量一样多。您可以使用单个“驱动”线程而不使用观察者/事件监听器模式,而不是事件循环。性能相同。 - Zombies

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接