事件循环和v8引擎如何在NodeJS中相互交互?

时间:2019-03-09 22:05:20

标签: javascript node.js v8 event-loop

我不明白实际上是什么使NodeJS看起来像单线程的?是单线程的事件循环,还是使用v8引擎在单个线程中运行实际的JavaScript代码的事实?这两个(v8和事件循环)如何相互影响?在实现代码中,我在哪里可以看到这两个地方相遇?

4 个答案:

答案 0 :(得分:1)

Node.js与V8与事件循环

  • NodeJS是基于Chrome V8 JavaScript引擎构建的JavaScript运行时。
  • Javascript是单线程的,因此任何Javascript实现(例如NodeJS)也是如此。
  • 事件循环最重要的是一种编程结构(遍历消息/事件队列),并且是JavaScript并发模型的基础。
  • V8提供了事件循环的默认实现。 NodeJS正在使用libuv提供的事件循环

他们如何“互动”?

我认为您的误解是-它确实是单线程的,但“似乎是多线程的”。怎么样? -由于事件循环。

由于JavaScript是单线程事件循环,因此NodeJS可以在后台以“并行”方式执行非阻塞I / O操作。 NodeJS尽可能将这些操作卸载到系统内核中(当今大多数是多线程的)

只要其中一项操作完成-内核会向NodeJS发送信号以执行该操作的回调函数-将该操作的回调函数添加到要在 poll 中执行的 poll 队列中>“事件循环”阶段(如下所述)。

启动时,NodeJS初始化事件循环并开始处理。事件循环由处理阶段的顺序,轮询阶段组成,并且队列是用于I / O处理的队列。

  

每个阶段都有一个要执行的回调FIFO队列。尽管每个阶段都有其自己的特殊方式,但是通常,当事件循环进入给定阶段时,它将执行该阶段特定的任何操作,然后在该阶段的队列中执行回调,直到队列耗尽或回调的最大数量为止已执行。当队列已用完或达到回调限制时,事件循环将移至下一个阶段,依此类推。   src

您可以在此处查看有关处理阶段和事件循环的更多详细信息:The Node.js Event Loop, Timers, and process.nextTick() | Node.js

答案 1 :(得分:0)

Javascript是单线程的。这意味着在任何时候,CPU只能为该进程执行一件事情,即正在运行的应用程序。

但是javascript也有Promise和异步代码。如果只有一件事情随时可以执行,那怎么可能?

答案是事件循环,该循环跟踪执行并在模拟异步的主要工作之后运行异步工作。

我无法进入事件循环的样子,因为我自己的知识并不丰富。

答案 2 :(得分:0)

为什么JavaScript是单线程的简化解释:

事件循环不断检查队列以查看是否需要运行任何代码。

while (queue.waitForMessage()) {
  queue.processNextMessage();
}

queue.waitForMessage()是同步的,因此如果队列当前为空,它会等待新消息到达。 在JavaScript环境中,不能抢占任何函数 -一旦函数开始执行,它将在执行任何其他代码之前运行完毕。

Node.js和V8

在每个JavaScript环境中都可以找到相同的行为,Node.js只是建立在Chrome's V8 JavaScript engine上的JavaScript运行时

Node.js事件循环

Node.js事件循环结构比我上面概述的要复杂得多。它由处理计时器和回调的 FIFO 队列的多个阶段组成,正是这些元素使Node.js环境具有了异步行为。所有I / O操作都转移到OS,并且由于基础系统是多线程的,因此这些操作在后台执行。操作完成后,系统会通知Node.js进程,并将回调添加到适当的队列中以等待执行。官方Node.js网站的guides section和实现异步I / O的libuv库的文档中提供了有关Node.js事件循环的更完整描述。

答案 3 :(得分:0)

对@Milan 回答的 Node.js vs. V8 vs. Event Loop 部分的一个小补充/说明:https://stackoverflow.com/a/50121471/1194266

<块引用>

V8 的解决方案是提供一个默认实现,嵌入 可以覆盖