- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
网上很多文章都以nodejs为例来演示 react 器模式。是不是更偏向于前者?
据我了解,两者的区别在于:
例如 this article :
Reactor Pattern is an idea of non-blocking I/O operations in Node.js. This pattern provides a handler(in case of Node.js, a callback function) that is associated with each I/O operation. When an I/O request is generated, it is submitted to a demultiplexer.
它实际上不是proactor的定义吗?
最佳答案
我不熟悉 Proactor 设计模式。在阅读了一些内容之后,我想我理解了你的困惑。
Many articles online demonstrates nodejs as an example of reactor pattern
这是真的。
Isn't it actually definition of proactor?
这也是事实。
不同的是你的观点。
在内部, Node 的事件循环是一个阻塞调用(讽刺的是)。这只是使用非阻塞 I/O 的最有效方式。不同的操作系统有不同的功能来请求操作系统在您感兴趣的事情发生时唤醒您的进程。由于 POSIX 要求,有一个所有现代操作系统都支持的跨平台 API:select()
。 Node.js 实际上使用 libuv,它会根据目标平台在编译时自动选择正确的 API。但出于此答案的目的,我们将重点关注 select()
。那么让我们看看select() :
numberOfEvents = select(numberOfWaits, read, write, err, timeout);
select()
函数会阻塞长达 timeout
毫秒,或者读取、写入或出错文件/套接字发生某些事情。仅通过一个函数,操作系统就提供了足够的功能来实现大部分 node.js,从 setTimeout()
和 setInterval()
等计时器到监听网络套接字。使用 select()
事件循环看起来像这样:
// Pseudocode:
while(1) {
evaluateJavascript();
timeout = calculateTimers();
events = select(n, read, write, err, timeout);
if (events > 0 || timersActive()) {
getCallbacks(events, read, write, err, timers());
}
}
这基本上是一种 Reactor 设计模式。
但是,node 在其实现中隐藏了这一点。它向 Javascript 程序员公开的是一组 API,用于注册回调并在事件发生时调用这些回调。这部分是历史的(浏览器 API 就是这样设计的),部分是实用的(这是一个更加灵活的架构——从 GTK 到 wxWindows 到 .Net 的几乎所有 GUI 框架都是这样工作的)。
您可能认为这听起来很像 Proactor 设计模式。事实上它是。
所以node.js本身就是Reactor设计模式的一个例子。
用 node.js 编写的 Javascript 程序是 Proactor 设计模式的示例。
关于node.js - nodejs 代表的是 Reactor 还是 Proactor 设计模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56739934/
Boost asio实现基于 ACE proactor 的前摄器设计模式. 我理解为什么我们需要异步读取。但是,我对异步写入感到困惑。 为什么我们需要异步写入?它对 TCP/UDP 连接也有用吗(写入
我希望将 Windows C++ 应用程序迁移到 C#,以便一些主要的增强功能更容易一些。 C++ 应用程序是单线程的,并使用自己开发的 react 器模式来处理接受、读取和写入套接字以及计时器的所有
我正在实现一个消息传递算法。当相邻节点在节点上有足够的信息来组成消息时,消息就会在相邻节点之间传递——从相邻节点传递到该节点的信息。如果我让每条消息成为一个线程并使用 boost::condition
网上很多文章都以nodejs为例来演示 react 器模式。是不是更偏向于前者? 据我了解,两者的区别在于: reactor handles events in a single thread (sy
我最近在一次代码审查中遇到了困难,在接口(interface)适配器中实现了一个 ASIO UDP 套接字;似乎实现了另一个输入 UDP 套接字,并且假设输入和输出都在同一个线程上。所以,我想知道为什
所以我在这里阅读我最喜欢的软件模式书籍之一(面向模式的软件架构 - 并发和网络对象的模式),特别是关于 Proactor/Reactor 异步 IO 模式的部分。我可以看到通过使用可选 channel
我是一名优秀的程序员,十分优秀!