事件循环、libuv和v8引擎的关系

Relationship between event loop,libuv and v8 engine

我正在学习 Node.js 的架构。我有以下问题。

  1. 事件循环是 libuv 还是 v8 的一部分?
  2. 事件队列是事件循环的一部分吗?事件队列是由 libuv 还是 v8 引擎或事件循环本身生成的?
  3. libuv和v8引擎有什么联系?
  4. 如果事件循环是单线程的,libuv 是否会创建多个线程来处理文件 I/O?
  5. 浏览器有事件循环机制还是只有 Node.js 有?
  1. 事件循环首先是一个高级概念,它是 JavaScript 编程模型的基本组成部分。实际上,每个 V8 嵌入器都需要实现一个事件循环。 V8 提供了一个默认实现,嵌入器可以替换或扩展它。

  2. 我不明白这个问题。 (我猜答案是"yes",但是"event loop"和"event queue"有什么区别?)

  3. None。 (除了 Node.js 同时使用两者。)

  4. 是的,事件循环是单线程的。

  5. 是的,浏览器也有事件循环(见问题 1)。

这其实并不像post选择的答案中给出的那么简单。我希望我的发言会更准确一点。希望我在 Sam Roberts (IBM) 关于 Node 事件循环的演讲中正确理解了他。

要亲自观看演讲,您可以到这里:https://www.youtube.com/watch?v=P9csgxBgaZ8

这是对@jmrk

给出的答案的补充

Libuv 将任务委托给底层操作系统。当您正在收听的事件发生时,操作系统将负责发送通知。它为您在 Node.js 中执行的许多操作执行此操作。比如:套接字(net/dgram/http/tls/https/child_process 管道、stdin、out、err)、超时和间隔。

然而,并不是所有的东西都可以像这样委托给底层 OS。有时需要创建一个线程(默认有 4 个线程,但您可以使用 UV_THREADPOOL_SIZE 更改它)。不可轮询的是文件系统操作,dns.lookup() 和一些加密函数。

通过这些点:-

  1. V8发动机是火车车厢用的发动机。它具有某些职责,包括为 运行 异步任务提供事件循环。

  2. 事件循环是执行异步任务的核心。一旦 C++ Web API 完成一个函数(任务),回调 called.It 就会被移至事件队列并等待直到堆栈变空。因此,事件队列是事件循环的一部分,由事件循环生成。

  3. V8 引擎用于执行我们编写的 javascript 代码,而 libuv 是一个库,用于在 Nodejs 中提供多线程功能以执行长 运行ning 进程。

  4. 事件循环是单线程的,但 Nodejs 不是单线程的,因为它在其 运行time 中有一个 libuv 线程池,负责多线程。

  5. 浏览器 API 也提供事件循环。

V8项目和libuv项目是NodeJS最重要的两个依赖。

我认为在进入节点事件循环之前对什么是线程有一个基本的了解是很重要的。

所以让我们把一个线程想象成一个需要由CPU执行的指令列表,CPU将运行这些线程一个接一个地启动在顶部向下。单个进程中可以有多个线程。

要了解线程,了解一个叫做 调度 的概念也很重要,因为您的 CPU 每秒只能处理这么多指令。

现在V8libuvEvent Loop有什么关系?

好吧,V8libuv 我建立的是 NodeJS 的依赖项,这就是 运行 JavaScript 在浏览器之外。每当我们在计算机上启动 Node 程序时,Node 都会自动启动一个线程并在该线程中执行一些代码。在那个单线程中有一个叫做 Event Loop 的东西,它可以被认为是一个控制结构,它决定我们的一个线程在任何时间点应该做什么。

它是任何Node程序的绝对核心,每个Node程序都有一个事件循环

所以:

Is event loop a part of libuv or v8?

是的,Event Loop 来自 Node 启动的一个进程,它有 V8libuv 作为依赖项。

Is event queue a part of event loop? are event queue generated by libuv or v8 engine or event loop itself?

事件队列,如果我理解这个问题更多地属于您的 OS 调度程序。它决定哪些是最紧迫的任务,哪些是最紧迫的任务,运行 首先是那些。

What is the connection between libuv and v8 engine?

嗯,它们都是NodeJS的依赖,都是用C++写的,V8是70%的C++,libuv是100% C++。

If event loop is single threaded, does libuv come into picture to create multiple threads to handle File I/O?

所以这可能会令人困惑,Node 事件循环 是单线程的,但是一些 Node 标准库 模块和一些框架不是单线程的。

libuv 库为 Node 提供了对操作系统的底层访问。 libuv 模块和 C++ 端使用线程池。它可用于 运行 计算量大的任务。

默认情况下,libuv 在线程池中创建四个线程。除了事件循环中使用的线程之外,还有四个其他线程可用于卸载需要在应用程序内部发生的昂贵计算。

Node 标准库中的许多函数都使用了这个线程池。所以是的 libuv 出现在图片中以创建一个由四个线程组成的线程池。所以 libuv 提供了一个线程池,用于卸载在非常昂贵的函数调用上完成的工作。

Does browsers have event loop mechanism or just Node.js does?

我只知道NodeJS内部有一个事件循环机制

总而言之,我们有一台 2015 款双核 MacBook Pro。想象一下你 运行 两个计算量大的函数,第一个 运行s 在线程池内的第一个线程上,它通过 OS Scheduler 和 CPU 第一核心。然后第二个函数被分配给池中的第二个线程,它被分配给第二个 CPU 核心。所以线程池发生在 libuv.

内部

有一点很重要,如果你正在发出 http 请求,libuv 会看到,libuv 和 Node 都没有处理网络请求涉及的所有超低级操作的任何代码。相反 libuvhttp 请求委托给底层操作系统。

在这种情况下,libuv 用于向操作系统发出请求并等待 OS 发出响应,返回要求。因此,因为 libuv 将此委托给您的 OS,由您的 OS 决定是否添加新线程。这是一个 http 请求,我们不受限于 libuv 的四线程线程池。所有工作都由操作系统本身完成,我们根本没有接触线程池。