(来源:mybalsamiq.com) 对于Node.js,事件循环也是在这里实现的。引用自问题。
Node.js事件循环在单个线程下运行,这意味着您编写的应用程序代码在单个线程上评估。Nodejs本身通过libuv使用许多线程,但在编写nodejs代码时,您永远不必处理这些线程。
然而,对于 Node.js 的事件循环,我仍然感到抽象。
- 有没有任何图片可以更清晰地介绍它?
- 这两个事件循环有什么不同?
Node.js事件循环在单个线程下运行,这意味着您编写的应用程序代码在单个线程上评估。Nodejs本身通过libuv使用许多线程,但在编写nodejs代码时,您永远不必处理这些线程。
然而,对于 Node.js 的事件循环,我仍然感到抽象。
Node.js的事件循环实现与基于浏览器的事件循环不同。
这是Node.js社区中一个很大的困惑点。
虽然Node.js使用Google V8作为其运行时,但它并没有使用V8来实现事件循环。
Node.js使用C编写的Libuv库来实现事件循环。
你所看到的上面的图表适用于JS事件循环,但对于Node.js事件循环来说则不同。
要完全理解Node.js事件循环,有三个参考资料需要学习:
Chrome和Node都有自己的事件循环(event-loop)。
浏览器或Node中的事件循环不是V8的一部分。事件循环是由浏览器或Node提供的不同应用程序/依赖库的一部分。
它们不使用V8的事件循环。
V8确实实现了一个事件循环,它在那里。
但是它可以被覆盖或替换,这正是Chrome和NodeJS同时执行的操作。
浏览器(Chrome)
V8仅执行JavaScript代码(if语句,for语句,函数,算术运算等),然后将操作交给Libevent。
除了JavaScript引擎V8(Chrome使用V8)之外,浏览器(例如Chrome)还包含不同的应用程序/依赖库,可以执行各种操作,如发送HTTP请求,监听DOM事件,使用setTimeout或setInterval延迟执行,缓存,数据库存储等等。
因此,浏览器(例如Chrome)使用依赖库Libevent来实现事件循环。
Node.js
V8只执行您的JavaScript(if和else语句,for语句,函数,算术运算等),然后将操作交给Libuv。默认情况下,JavaScript不支持网络和文件系统操作。Libuv与V8一起工作,以便V8运行JavaScript,而Libuv将处理I/O任务。
除了JavaScript引擎V8外,在Node.js中还包含不同的应用程序/依赖项/库,可以执行各种操作,例如网络,文件系统操作,监听系统事件,使用setTimeout,setInterval,setImmediate,process.nextTick延迟执行等等。
因此,Node.js使用依赖项Libuv来实现事件循环。
如果回调队列(阶段)中没有任务,Node的事件循环将处于空闲状态,但Chrome的事件循环会继续运行。
Chrome的事件循环就像旋转木马,而Node的事件循环则像过山车
还有其他差异,您可以在这里查看。