JavaScript 事件循环和 Node.js 事件循环有什么区别?

zan*_*ngw 9 javascript event-loop node.js

在 JavaScript 中,事件循环用于引擎中。下面是一张图表来说明这篇文章


(来源:mybalsamiq.com

对于 Node.js,事件循环也在此处实现。引用这个问题

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

然而,关于 node.js 事件循环对我来说仍然是抽象的。

  • 有没有图片可以更清楚的介绍一下?
  • 这两个事件循环有什么不同?

Kan*_*per 12

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

  • @slebertman 首先仅仅因为其他人的观点与你的观点相悖而称其为愚蠢,根本没有建设性。此外,问题是问什么?背后的架构使用相同的模式并不重要。感谢您阅读源代码并以其他形式实现它,但如果我问**有什么区别**,我希望知道实现有何不同以及原因。如果可能的话,避免笼统,还要注意这种混乱来自作者的演讲,所以你可能必须以一种不居高临下的方式与他交谈。 (5认同)
  • 如果您要争论这一点,您不妨说 Firefox 的事件循环与 javascript 不同——这很愚蠢。当然,不同的实现有不同的实现 - 但**事件循环** - Firefox、V8、Edge、Internet Explorer、Adobe Flash(livescript - ECMAScript 兼容语言)、Adobe Photoshop (javascript)、Node.js 背后的反应式设计模式。 Node.js 和 Rhino(还有人还记得这个服务器端引擎吗??)是一样的 (2认同)
  • 我读了源代码。事件循环模型完全相同。唯一的区别是节点使用线程池来管理磁盘 I/O - 但现在它又与浏览器的 Webworkers 线程实现类似。网络 I/O 的结构和基于它的事件循环是相同的。我自己已经多次编写过这样的事件循环。细节总是不同,但架构是相同的。 (2认同)

Suj*_*ari 7

双方chromenode拥有自己的 event-loop

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

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

V8 确实实现了一个事件循环,它就在那里

然而,它意味着被覆盖或替换,这是 Chrome 和 NodeJS 碰巧做的事情。

浏览器 (Chrome)

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

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

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


节点.js

V8 只是执行您的 JavaScript(If 和 else 语句,用于语句、函数、算术运算等),然后将操作移交给Libuv。JavaScript 默认不支持网络和文件系统操作。Libuv 与 V8 一起工作,因此 V8 将运行 JavaScript,而 Libuv 将处理 I/O 任务。

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

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


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

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

还有其他区别,你可以看这里