事件驱动模型和反应堆模式有什么区别?

时间:2012-02-04 04:03:17

标签: events design-patterns twisted eventmachine

来自维基百科Reactor Pattern文章:

  

反应堆设计模式是一种事件处理模式,用于处理通过一个或多个输入同时传递给服务处理程序的服务请求。

它列举了几个例子,例如: nodejstwistedeventmachine

但据我所知,上面是流行的事件驱动框架,所以让它们也成为反应堆模式框架?

如何区分这两者?或者他们是一样的?

2 个答案:

答案 0 :(得分:125)

反应器模式比“事件驱动编程”更具体。它是在进行事件驱动编程时使用的特定实现技术。但是,这个术语在典型的对话中并没有得到很好的准确使用,所以你应该小心使用它并期望你的听众理解你,并且当你遇到它时,你应该小心你如何解释这个术语。

查看反应堆模式的一种方法是将其视为与“非阻塞”操作的概念密切相关。当某些操作可以无阻塞地完成时,反应器会发出通知。例如,select(2)可用于实现反应器模式,以使用标准BSD套接字API(recv(2)send(2)等)读取和写入套接字。 select将告诉您何时可以立即从套接字接收字节 - 例如,因为字节存在于该套接字的内核接收缓冲区中。

在考虑这些想法时,您可能需要考虑的另一种模式是 proactor 模式。与反应器模式相反,无论它们是否可以立即完成,预控器模式都会启动操作,是否异步执行,然后安排发送有关其完成的通知。

Windows I / O完成端口(IOCP)API是可以看到 proactor 模式的一个示例。在使用IOCP对套接字执行发送时,无论该套接字的内核发送缓冲区是否有任何空间,都会启动发送操作。当WSASend调用立即完成时,发送操作继续(在另一个线程中,可能是内核中的线程)。当send 实际完成时(意味着发送的字节只被复制到该套接字的内核发送缓冲区中),调用提供给WSASend调用的回调函数(在应用程序中的新线程。

这种启动操作然后在完成操作时得到通知的方法是异步操作的核心。将其与非阻塞操作进行比较,等待操作在尝试执行操作之前立即完成。

这两种方法都可用于事件驱动编程。使用reactor模式,程序等待(例如)一个可读的套接字的事件,然后从中读取。使用proactor模式,程序将等待套接字读取完成的事件

严格来说,Twisted滥用术语 reactor 。基于select(2)twisted.internet.selectreactor)的Twisted反应器是使用非阻塞I / O实现的,它非常类似于反应堆。但是,它暴露给应用程序代码的接口是异步,使其更像proactor。 Twisted还有一个基于IOCP的反应器。此反应器公开了相同的面向应用程序的异步API 使用类似proactor的IOCP API。这种混合方法在细节上从平台到平台不同,使“反应堆”和“主动”这两个术语都不准确,但由于twisted.internet.reactor暴露的API基本上完全是异步而不是非阻塞, proactor 可能是更好的名称选择。

答案 1 :(得分:1)

要处理TCP连接,有两种竞争的Web体系结构,即基于线程的体系结构和事件驱动的体系结构。

基于线程的体系结构

实现多线程服务器的最早方法是遵循“每个连接线程”方法。为了控制和限制正在运行的线程数,可以将单个调度程序线程与有限的阻塞队列和线程池一起使用。

调度程序在TCP套接字上阻塞以进行新连接,并将其提供给有界阻塞队列。超出队列限制的TCP连接将被丢弃,从而允许接受的连接以理想且可预测的延迟运行。

事件驱动的体系结构

将线程与连接分开,事件驱动的体系结构仅允许将线程用于特定处理程序上的事件。

这个创意概念使“反应堆模式”得以现身并展示出来。基于此体系结构构建的系统由事件创建者和事件使用者组成。

反应堆模式

反应堆模式是事件驱动体系结构中用于TCP连接处理的最流行的实现技术。简而言之,它使用单线程事件循环来阻塞事件,并将这些事件分配给相应的处理程序。

只要注册了事件处理程序来处理它们,就不需要其他线程在I / O上进行阻塞。考虑到TCP连接,我们可以轻松地将事件引用到以下实例:已连接,已准备好输入,已准备好输出,超时和已断开连接。

Reactor模式将模块化应用程序级代码与可重用的Reactor实施解耦。为了实现这一点,反应堆模式的体系结构由两个重要的参与者组成-反应堆和处理程序。

反应器

Reactor在单独的线程中运行,它通过将工作分配给适当的注册处理程序来对I / O事件(例如已连接,可输入,可输出,超时和断开连接)做出反应。

处理程序

处理程序执行实际的工作或需要通过I / O事件完成的响应。 Reactor通过调度适当的处理程序来响应I / O事件。

吉姆·科普林(Jim Coplien)和道格拉斯·施密特(Douglas C. Schmidt)于1995年出版的“程序设计模式语言”是详细解释了Reactor Pattern的书之一。