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

问题描述 投票:2回答:3

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

javascript node.js v8 event-loop
3个回答
1
投票

Node.js vs. V8 vs. Event Loop

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

How do they 'interact'?

我认为你的误解是 - 它是真正的单线程,但它似乎是“多线程的”。怎么样? - 因为事件循环。

因为JavaScript是单线程的,所以Event Loop允许NodeJS在“并行”的后台执行非阻塞I / O操作。 NodeJS尽可能将这些操作卸载到系统内核(现在大多数都是多线程的)

每当其中一个操作完成时 - 内核向NodeJS发出信号以执行该操作回调函数 - 将该操作的回调函数添加到轮询队列中,以便在事件循环的轮询阶段执行(如下所述)。

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

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

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


0
投票

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

但是javascript也有承诺和异步代码。如果只有一件东西可以随时执行,那怎么可能呢?

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

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


0
投票

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

Event Loop不断检查队列以查看是否有任何需要运行的代码。

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操作都卸载到操作系统,并且由于底层系统是多线程的,因此操作在后台执行。当操作完成时,系统通知Node.js进程,并将回调添加到适当的队列以等待执行。有关Node.js事件循环的更完整描述可在官方Node.js网站的guides section和实现异步I / O的libuv库的文档中找到。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.