Node.js事件循环(2)

55 阅读1分钟

前文我们介绍了事件循环中的宏任务和微任务,这篇文章我们来介绍一下异步网络I/O和线程的问题。

异步网络I/O

通过对同步代码执行耗时和异步网络I/O代码执行耗时的比较,我们可以得出结论,异步网络 I/O 充分利用了 Node.js 的异步事件驱动能力,将耗时 CPU 计算逻辑给到其他进程来处理,而无须等待耗时 CPU 计算,可以直接处理其他请求或者其他部分逻辑。第一种同步执行的方式就无法去处理其逻辑,导致性能受到影响.

单线程还是多线程

在前文中我们分析过这个问题,暂时认为Node.js是单线程执行的。其实这里有个问题,通过我们分析的异步I/O问题我们可以发现,他并不是单线程执行的,事实应该是主线程是单线程执行的,但是 Node.js 存在多线程执行,多线程包括 setTimeout 和异步 I/O 事件。其实 Node.js 还存在其他的线程,包括垃圾回收、内存优化等。

主要还是主线程来循环遍历当前事件。

我们再来解释一下浏览器和Node.js事件循环的区别,其实二者是非常相似的,浏览器和node的事件循环机制是一样的,主线程、微任务、宏任务执行逻辑都没有差异,区别在于浏览器中没有process.nextTick()和I/O。

此文章为6月Day016学习笔记,内容来源于极客时间《Node.js开发实战》,强烈推荐该课程!