Node.js+Webpack开发实战
上QQ阅读APP看书,第一时间看更新

1.2 Node.js的运行原理

我们已经了解了Node.js组成部分各自的面貌。现在来看看它们是如何相互协作以提供强大的网络服务功能。Node.js系统如图1-2所示。

图1-2

Node.js应用启动时,会开启JS线程(主线程)、由libuv提供的线程池(Worker Threads)和一个事件循环(Event Loop)。JS线程负责执行应用代码,当发现有I/O操作时,直接提交给libuv的线程池并注册回调函数,不会等待I/O结束后再继续运行,而是拿到一个状态后继续执行,这就是“单线程非阻塞I/O”。

I/O操作结束之后会有一个事件,该事件会放在事件队列(Event Queue)中,事件循环每次都会检查是否有事件需要处理,如果有就处理,否则进行下一轮轮询;如果没有任何事件需要处理则退出进程。这就是“事件驱动”。

在I/O密集型应用中,主线程只负责提交任务,轮询结果,耗时的任务执行部分会提交给底层执行,这就是Node.js为什么会有如此高性能的原因。