首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >事件驱动模型和反应器模式有什么不同?

事件驱动模型和反应器模式有什么不同?
EN

Stack Overflow用户
提问于 2012-02-04 12:03:17
回答 3查看 25.6K关注 0票数 72

来自维基百科Reactor Pattern的文章:

反应器设计模式是一种事件处理模式,用于处理由一个或多个输入并发传递给服务处理程序的服务请求。

它列举了几个示例,例如nodejstwistedeventmachine

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

如何区分这两者?还是说它们是一样的?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-05 02:42:28

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

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

在考虑这些想法时,您可能需要考虑的另一个模式是proactor模式。与反应器模式不同,proactor模式让操作开始,而不管它们是否可以立即完成,让它们异步执行,然后安排传递关于它们完成的通知。

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

这种启动操作并在操作完成时得到通知的方法是异步操作思想的核心。将其与非阻塞操作进行比较,在非阻塞操作中,您需要等待操作可以立即完成,然后再尝试执行该操作。

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

严格地说,Twisted滥用了反应堆这个术语。基于select(2) (twisted.internet.selectreactor)的扭曲电抗器采用非阻塞I/O方式实现,非常类似于电抗器。但是,它向应用程序代码公开的接口是异步的,这使得它更像proactor。Twisted也有一个基于IOCP的反应堆。该反应器公开了相同的异步面向应用程序的APIs,而则使用类似proactor的IOCP。这种混合方法在细节上因平台而异,这使得术语“反应器”和" proactor“都不是特别准确,但是由于twisted.internet.reactor公开的API基本上是完全异步的,而不是非阻塞的,所以proactor可能是一个更好的名称。

票数 124
EN

Stack Overflow用户

发布于 2016-08-16 17:25:07

我认为这种“非阻塞”和“异步”的分离是错误的,因为“异步”的主要含义是“非阻塞”。反应器模式是关于异步(即非阻塞)调用,但对这些调用进行同步(阻塞)处理。Proactor是关于异步(非阻塞)调用和对这些调用的异步(非阻塞)处理。

票数 6
EN

Stack Overflow用户

发布于 2018-09-30 01:34:17

为了处理TCP连接,有两种相互竞争的web体系结构,即基于线程的体系结构和事件驱动体系结构。

基于线程的架构

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

调度程序在TCP套接字上阻塞新连接,并将它们提供给有界阻塞队列。超过队列界限的TCP连接将被丢弃,从而允许接受的连接以期望的和可预测的延迟运行。

事件驱动架构

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

这种创造性的概念允许反应堆模式从货架上出来并展示出来。基于此架构构建的系统由事件创建者和事件消费者组成。

反应堆模式

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

其他线程不需要阻塞I/O,只要注册了事件处理程序来处理它们。考虑到TCP连接,我们可以很容易地将事件引用到这些实例:已连接、输入就绪、输出就绪、超时和断开。

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

反应堆

反应器在单独的线程中运行,它通过将工作分派到适当的注册处理程序来对I/O事件做出反应,例如连接、输入就绪、输出就绪、超时和断开连接。

处理程序

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

Jim Coplien和Douglas C.Schmidt于1995年出版的“程序设计的模式语言”是详细解释反应器模式的书籍之一。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9138294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档