【问题标题】:What is the different between JavaScript Event loop and Node.js Event loop?JavaScript 事件循环和 Node.js 事件循环有什么区别?
【发布时间】:2015-10-13 11:33:55
【问题描述】:

在 JavaScript 中,引擎中使用了事件循环。这是一张来自article的图表。


(来源:mybalsamiq.com

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

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

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

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

【问题讨论】:

    标签: javascript node.js event-loop


    【解决方案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

    【讨论】:

    • 如果您要争论这一点,您不妨说 Firefox 的事件循环与 javascript 不同——这很愚蠢。当然,不同的实现有不同的实现 - 但 事件循环 - Firefox、V8、Edge、Internet Explorer、Adobe Flash(livescript - 一种 ECMAScript 兼容语言)、Adobe Photoshop (javascript) 背后的反应式设计模式,Node.js 和 Rhino(还有人记得这个服务器端引擎吗??)是一样的
    • 对不起。但在这一点上你是不正确的。您不必相信我,但是如果您观看 Bert Belder 的视频,Bert Belder 是 Nodejs 事件循环库 (Libuv) 的合著者之一,他谈到了这一点。 youtube.com/watch?v=PNa9OMajw9w Nodejs 使用与 ECMAScript 兼容浏览器不同的事件循环模型。我提供的链接清楚地说明了这一点。
    • 我阅读了源代码。事件循环模型完全相同。唯一的区别是 node 使用线程池来管理磁盘 I/O - 但现在它再次与浏览器的 webworkers 线程的实现相似。网络 I/O 的结构和基于它的事件循环是相同的。我自己已经多次编写过这样的事件循环。细节总是不同的,但架构是一样的。
    • @slebertman 首先说别人的观点很愚蠢,因为他们与你的观点相反,根本没有建设性。此外,问的问题是什么?背后的架构使用相同的模式并不重要。感谢您阅读源代码并以其他形式实现它,但如果我问有什么区别,我希望知道实现方式有何不同以及原因。如果可能,请避免笼统地概括,并注意这种混淆来自作者的陈述,因此您可能必须以不居高临下的方式与他交谈。
    【解决方案2】:

    chromenode 都有自己的 event-loop

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

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

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

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

    浏览器 (Chrome)

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

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

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


    Node.js

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

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

    因此 Node.js 使用依赖 Libuv 来实现 Event Loop。


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

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

    还有其他的不同,你可以看看here

    【讨论】:

      【解决方案3】:

      这两个事件循环有什么区别?

      什么都没有。 Nodejs JavaScript 引擎1.

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

      有没有图片介绍的更清楚?

      有很多。但我认为动画更好:-) Philip Roberts 的This jsconf talk 到处都受到称赞。

      【讨论】:

      • 它们有细微的差别,但它们就在那里。这个答案是完全错误的。 gist.github.com/andreybolonin/2413da76f088e2c5ab04df53f07659ea
      • @iwaduarte 这个问题没有问libuv和libev的区别?!您发现的要点可能在Nodejs Event Loop(深入细节)或Is libuv just a wrapper on libev on POSIX systems? 很有价值。
      • @Nickon 请说明问题所在以便我改进
      • @Nickon 请比仅仅删除视频链接更具体。或者,只需发布​​您自己的答案,我希望它会变得清楚您的观点有何不同。
      • 令人惊讶的是这个答案有多么错误......不,nodejs 不是 JS 引擎,v8 是,node 是环境运行时。不,浏览器的 (HTML) 事件循环和节点的事件循环完全不同。他们只是没有相同的处理模型(HTMLnode)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-20
      • 2022-01-09
      • 2017-04-14
      • 1970-01-01
      • 1970-01-01
      • 2013-05-23
      • 1970-01-01
      相关资源
      最近更新 更多