摘自Wikipedia Reactor Pattern文章:
反应堆设计模式是一种事件处理模式,用于处理通过一个或多个输入同时交付给服务处理程序的服务请求。
它命名了几个例子,例如nodejs
,twisted
,eventmachine
但是我了解到上面是流行的事件驱动框架,因此使它们也成为反应堆模式框架吗?
如何区分这两者?还是一样?
摘自Wikipedia Reactor Pattern文章:
反应堆设计模式是一种事件处理模式,用于处理通过一个或多个输入同时交付给服务处理程序的服务请求。
它命名了几个例子,例如nodejs
,twisted
,eventmachine
但是我了解到上面是流行的事件驱动框架,因此使它们也成为反应堆模式框架吗?
如何区分这两者?还是一样?
Answers:
反应堆模式比“事件驱动的编程”更为具体。它是进行事件驱动的编程时使用的一种特定的实现技术。但是,该术语在典型的会话中使用的准确性不高,因此您应谨慎使用该术语,并希望您的听众理解您,并且在遇到该术语时应谨慎理解。
一种查看反应堆模式的方法是,将其视为与“非阻塞”操作的思想密切相关。当某些操作可以完成而没有阻塞时,反应堆会发出通知。例如,select(2)
可用于实施反应器图案用于读取和使用标准的BSD套接字API的(写入到插座recv(2)
,send(2)
等)。 select
会告诉您何时可以立即从套接字接收字节-例如,因为字节存在于该套接字的内核接收器缓冲区中。
考虑这些想法时,您可能要考虑的另一种模式是proactor模式。与反应堆模式相比,前摄器模式不管它们是否可以立即完成都开始操作,使其异步执行,然后安排传递有关其完成的通知。
Windows I / O完成端口(IOCP)API是一个示例,可以看到proactor模式。使用IOCP在套接字上执行发送时,无论内核发送缓冲区中是否有用于该套接字的空间,都会启动发送操作。当WSASend
调用立即完成时,发送操作继续(在另一个线程中,也许在内核中的线程中)。当发送实际完成时(仅意味着要发送的字节已复制到该套接字的内核发送缓冲区中),将为调用提供一个回调函数WSASend
(在应用程序的新线程中)。
这种启动操作然后在操作完成时得到通知的方法是异步操作概念的核心。将其与非阻塞操作进行比较,在非阻塞操作中,您等待直到操作可以立即完成才尝试执行它。
两种方法均可用于事件驱动的编程。使用反应堆模式,程序等待(例如)套接字可读的事件,然后从中读取。使用proactor模式,该程序改为等待套接字读取完成的事件。
严格来说,Twisted滥用反应堆一词。基于select(2)
(twisted.internet.selectreactor
)的双绞反应器是使用非阻塞I / O实现的,它非常类似于反应器。但是,它提供给应用程序代码的接口是异步的,从而使其更加类似于proactor。Twisted还具有基于IOCP的电抗器。该反应器公开相同的面向应用程序的异步API,并使用类似于proactor的IOCP API。这种混合方法因平台的不同而有所不同,它使“反应堆”和“执行器”这两个术语都没有特别准确,但是由于公开的APItwisted.internet.reactor
基本上是完全异步的,而不是非阻塞的,因此 可能是更好的名字选择。
select
和接收字节来解释反应堆模式,那么您应该使用它们来解释proactor模式。否则,这很令人困惑,因为对比变得太模糊了,因为场景中不止一件事发生了变化。实际上有两种不同的情况。您只能使用一个!
为了处理TCP连接,有两种竞争的Web体系结构,即基于线程的体系结构和事件驱动的体系结构。
实现多线程服务器的最早方法是遵循“每个连接线程”方法。为了控制和限制正在运行的线程数,可以将单个调度程序线程与有限的阻塞队列和线程池一起使用。
调度程序在TCP套接字上为新连接阻塞,并将它们提供给有界阻塞队列。超出队列限制的TCP连接将被丢弃,从而允许接受的连接以理想且可预测的延迟运行。
事件驱动的体系结构将线程与连接分开,仅允许将线程用于特定处理程序上的事件。
这个创意概念使“反应堆模式”得以现身并展示出来。基于此体系结构构建的系统由事件创建者和事件使用者组成。
反应器模式是事件驱动体系结构中用于TCP连接处理的最流行的实现技术。简而言之,它使用单线程事件循环来阻塞事件,并将这些事件分配给相应的处理程序。
只要注册了事件处理程序来处理它们,就不需要其他线程阻塞I / O。考虑到TCP连接,我们可以轻松地将事件引用到以下实例:已连接,已准备好输入,已准备好输出,超时和断开连接。
反应堆模式将模块化应用程序级代码与可重用的反应堆实现解耦。为此,反应堆模式的体系结构由两个重要的参与者组成-Reactor和Handlers。
Reactor在单独的线程中运行,并且它通过将工作分配给适当的注册处理程序来对I / O事件(例如已连接,可输入,可输出,超时和断开连接)做出反应。
处理程序执行实际的工作或需要通过I / O事件完成的响应。Reactor通过调度适当的处理程序来响应I / O事件。
吉姆·科普林(Jim Coplien)和道格拉斯·施密特(Douglas C. Schmidt)于1995年出版的“程序设计模式语言”是详细解释了反应堆模式的书之一。