2年前关闭。
从Wikipedia Reactor Pattern文章:
它列举了一些例子,例如
nodejs
,twisted
,eventmachine
但是我了解到上面是流行的事件驱动框架,因此使它们也成为反应堆模式框架吗?
如何区分这两者?还是一样?
最佳答案
反应堆模式比“事件驱动的编程”更为具体。它是进行事件驱动的编程时使用的一种特定的实现技术。但是,该术语在典型的 session 中使用的准确性不高,因此您应谨慎使用该术语,并希望您的听众能理解您,并且在遇到该术语时应谨慎解释。
一种查看反应堆模式的方法是,将其视为与“非阻塞”操作的思想密切相关。当某些操作可以完成而没有阻塞时,反应堆会发出通知。例如,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
)的Twisted反应堆是使用非阻塞I / O实现的,它非常类似于反应堆。但是,它提供给应用程序代码的接口(interface)是异步的,从而使其更加类似于proactor。 Twisted还具有基于IOCP的电抗器。该反应器公开了相同的面向异步应用程序的API ,而使用类似于proactor的IOCP API。这种混合方法因平台的不同而有所不同,它使“反应器”和“处理器”这两个术语都没有特别准确,但是由于twisted.internet.reactor
公开的API基本上是完全异步的而不是非阻塞的,因此处理器可能是更好的名称选择。
关于events - 事件驱动模型和 react 堆模式之间有什么区别? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9138294/