JavaScript Event循环和Node.js事件循环之间有什么不同?

时间:2015-07-23 08:58:42

标签: javascript node.js event-loop

在JavaScript中,事件循环用于引擎。以下是一张用article来说明它的图表。

对于Node.js,事件循环也在这里实现。引用此question

  

Node.js事件循环在单个线程下运行,这意味着您编写的应用程序代码在单个线程上进行评估。 Nodejs本身使用了libuv下面的许多线程,但是在编写nodejs代码时你永远不必处理那些线程。

但是,关于node.js事件循环,我仍然是抽象的。

  • 有没有图片可以更清楚地介绍它?
  • 这两个事件循环之间有什么不同?

3 个答案:

答案 0 :(得分:2)

chromendoe都有自己的event-loop

浏览器或节点中的事件循环不属于V8。事件循环是浏览器或节点提供的不同应用程序/依赖关系/库的一部分

他们不使用V8的事件循环。

V8确实实现了事件循环,它是there

但是,它应被覆盖或替换,这是Chrome和NodeJS都要做的。

浏览器(Chrome)

V8只是执行JavaScript(if和else语句,用于语句,函数,算术运算等),然后将操作移交给Libevent

在除了JavaScript Engine V8(Chrome使用V8)之外的浏览器(例如Chrome)中,浏览器还包含不同的应用程序/依赖项/库,它们可以执行各种操作,例如发送HTTP请求,侦听DOM事件,延迟执行使用setTimeout或setInterval,缓存,数据库存储等等。

因此,浏览器(例如Chrome)使用依赖项Libevent来实现事件循环。


Node.js

V8仅执行JavaScript(if和else语句,用于语句,函数,算术运算等),然后将操作移交给Libuv。默认情况下,JavaScript不支持网络和文件系统操作。 Libuv与V8配合使用,以便V8将运行JavaScript,而Libuv将处理I / O任务。

在Node.js中,除了JavaScript Engine V8之外,Node还包含不同的应用程序/依赖项/库,它们可以执行多种操作,例如联网,文件系统操作,侦听系统事件,使用setTimeout,setInterval,setImmediate延迟执行,process.nextTick等。

因此,Node.js使用依赖项Libuv来实现事件循环。


如果回调队列(阶段)中没有任务,则节点的事件循环将处于空闲状态,但Chrome的事件循环将继续运行

Chrom的事件循环就像旋转木马,而Node的事件循环就像过山车

也有其他区别,您可以查看here

答案 1 :(得分:1)

  

这两个事件循环之间的区别是什么?

无。 Nodejs JavaScript引擎 1

1:或者更确切地说,其中一个,还有其他引擎实现相同的语言和相同的事件循环概念。

  

有没有图片可以更清楚地介绍它?

有很多。但我觉得动画效果更好:-) This jsconf talk菲利普罗伯茨在各地都受到称赞。

答案 2 :(得分:1)

Nodejs事件循环的实现方式与基于浏览器的事件循环的实现方式不同。

这是Nodejs社区中的一大困惑。

Nodejs在运行时使用Google V8,但未使用V8来实现事件循环。

Nodejs使用Libuv库(用C ++编写)来实现事件循环。

您上面的可用于JS事件循环的图与用于Nodejs事件循环的图不同。

为了全面了解Nodejs事件循环,您应该学习三个参考资料:

  1. https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/
  2. http://docs.libuv.org/en/v1.x/design.html
  3. https://www.youtube.com/watch?v=sGTRmPiXD4Y