Node.js 中的反应器模式是什么?
反应堆模式用于避免输入/输出操作的阻塞。它为我们提供了一个与 I/O 操作相关的处理程序。当要生成 I/O 请求时,它们被提交给解复用器,该解复用器处理并发以避免 I/O 模式的阻塞,并以事件的形式收集请求并将这些事件排队。
执行 I/O 操作的方式有两种:
- 阻塞 I/O:应用程序将进行函数调用并暂停其执行,直到接收到数据。它被称为“同步”。
- 非阻塞 I/O:应用程序将进行函数调用,并且在不等待结果的情况下继续执行。它被称为“异步”。
注意: Node.js 本质上是异步的。
反应器模式包括:
- 资源:它们由多个应用程序共享用于 I/O 操作,通常执行速度较慢。
- 同步事件解复用器/事件通知器:这使用事件循环来阻塞所有资源。当一组 I/O 操作完成时,事件解复用器将新事件推送到事件队列中。
- 事件循环和事件队列:事件队列将发生的新事件与其事件处理程序对一起排队。
- 请求处理程序/应用程序:通常,这是为资源上的注册事件提供要执行的处理程序的应用程序。
反应堆模式是如何工作的?
- 一切从应用程序开始。它发出请求,事件多路分解器收集这些请求,然后形成称为事件队列的队列。
- 事件解复用器由 libuv 运行,这是一个允许 JavaScript 代码(通过 V8)执行 I/O、网络内、文件等的库。它是一个允许 Node.js 执行 I/O 的异步 IO 库。
- 在上图中,只有一个事件队列,有 7 个基本队列。这些队列具有升序优先级,事件循环首先检查具有最高优先级的队列。
- Timers 队列具有最高优先级。 setTimeout 和 setInterval 函数在这里排队。一旦事件在这个队列中完成,或者时间到了,事件循环将这些函数传递给调用堆栈,称为执行处理程序。
- 当其中一个事件队列完成时,事件循环不会跳转到下一个队列,而是首先检查另外两个队列,这些队列将其他微任务和处理称为 nextTick 函数。然后它将跳转到即将到来的队列。
回调队列是事件队列,调用堆栈是执行处理程序。