Open Marinerer opened 6 years ago
.
.
,
Node.js 基于单线程事件循环。 此体系结构模型可高效地处理并发操作。 并发是指事件循环在完成其他工作之后执行 JavaScript 回叫函数的能力。
在此体系结构模型中:
此上下文中的线程是操作系统可以独立管理的单个编程指令序列。
在 Node.js 中,I/O 操作(例如,读取磁盘文件或对其写入,或者对远程服务器进行网络调用)被视为阻止操作。 阻止操作会阻止所有后续任务,直到该操作完成,然后才能继续下一个操作。 在非阻止模型中,事件循环可以同时运行多个 I/O 操作。
名称“事件循环”描述“忙碌-等待”机制的使用方式,该机制以同步方式等待消息到达,然后再处理消息。 下面显示了一个事件循环实现:
JavaScript复制
while (queue.wait()) {
queue.process();
}
Node.js 使用事件驱动的体系结构,其中的事件循环处理编排,辅助角色池阻止任务。 事件循环使 Node.js 能够处理并发操作。 下图大致说明了事件循环的工作原理:
事件循环的主要阶段包括:
setTimeout()
和 setInterval()
计划的回叫。socket.destroy()
)和回叫(例如 socket.on('close', ...)
)。Node.js 使用辅助角色池处理阻止任务。 这包括阻止 I/O 操作以及占用大量 CPU 的任务。
总而言之,事件循环运行为事件注册的 JavaScript 回叫,还负责实现非阻止异步请求(如网络 I/O)。
JavaScript 可以产生与低级语言(例如 C)相同的性能结果,因为 V8 引擎可以提高性能。 Node.js 还利用了 JavaScript 独特的事件驱动特性。 这样便可以快速且高效地编写服务器任务。
为支持功能强大的基于事件的编程模型,Node.js 提供了一组内置的非阻止 I/O API 来处理文件系统和数据库操作等常见任务。 这些 API 由 libuv 库提供。 当你请求 Node.js 读取磁盘中的文件内容时,Node.js 不会阻止等待磁盘和文件描述符准备就绪。 当文件准备就绪时,非阻止 I/O 接口将通知 Node.js。 当触发鼠标或键盘事件,或者从远程终结点接收到 XMLHttpRequest (XHR) 响应时,该非阻止 I/O 的工作方式与浏览器通知代码时的方式相同。
Nodejs入门系列