events - 事件驱动模型和 react 器模式有什么区别?

标签 events design-patterns twisted eventmachine

来自维基百科Reactor Pattern文章:

The reactor design pattern is an event handling pattern for handling service requests delivered concurrently to a service handler by one or more inputs.

它举了几个例子,例如nodejs , twisted , eventmachine

但是据我了解,上面是流行的事件驱动框架,所以让它们也成为 react 器模式框架吗?

如何区分这两者?或者它们是相同的?

最佳答案

react 器模式比“事件驱动编程”更具体。它是进行事件驱动编程时使用的一种特定实现技术。然而,该术语在典型对话中的使用不太准确,因此您应该谨慎使用它并期望您的听众能够理解您的意思,并且当您遇到该术语的使用时,您应该小心如何解释该术语。

查看 react 器模式的一种方法是考虑它与“非阻塞”操作的思想密切相关。当某些操作可以在不阻塞的情况下完成时, react 器会发出通知。例如,select(2) 可用于实现 react 器模式,以便使用标准 BSD 套接字 API (recv(2) >发送(2)等)。 select 会告诉您何时可以立即从套接字接收字节 - 例如,因为这些字节存在于该套接字的内核接收缓冲区中。

在思考这些想法时您可能需要考虑的另一种模式是前摄器模式。与 react 器模式相比,前摄器模式让操作开始,无论它们是否可以立即完成,让它们异步执行,然后安排传递有关其完成的通知。

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

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

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

严格来说,Twisted 误用了术语 react 器。 Twistedreactor基于select(2) (twisted.internet.selectreactor),使用非阻塞I/O实现,非常类似于reactor。然而,它向应用程序代码公开的接口(interface)是异步的,这使得它更像前摄器。 Twisted还有一个基于IOCP的 react 器。该 react 器公开相同的面向异步应用程序的 API使用类似前摄器的 IOCP API。这种混合方法的细节因平台而异,因此术语“reactor”和“proactor”都不是特别准确,但由于 twisted.internet.reactor 公开的 API 基本上是完全异步的对于非阻塞,proactor 可能是更好的名称选择。

关于events - 事件驱动模型和 react 器模式有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9138294/

相关文章:

c# - ASP.NET Web 表单自定义验证器未触发

c# - 防止C#中的重复代码

java - 当父类型始终是子类时,如何设计整个层次结构以具有“不可变”父字段?

python - 使用扭曲和 (tx) 请求异步下载文件

javascript - 向多个 <input/> 元素(现在和 future )添加事件(例如模糊)

javascript - 如何实现多个事件触发和事件内存(事件和 promise 相结合的特性)

C#:ObservableCollection - 为什么没有通用 "CollectionChanged"事件?

java - 单例模式

multithreading - 多处理与扭曲

python - 如何处理使用双绞线的R/W的多个串口?