发布于 2026-01-05 14 阅读
0

深入了解 JavaScript Promise 与 V8 引擎内部原理

深入了解 JavaScript Promise 与 V8 引擎内部原理

😅 由于 JavaScript 或 NodeJS 是单线程语言,大多数人认为它们速度慢且可扩展性差。而 Python 和 JS 则恰恰相反:

Javascript Python 梗

这要看情况。如果你的服务是 I/O 密集型的(例如文件读取、数据库调用、HTTP 调用等输入输出操作),这意味着它依赖于其他资源的读取或写入。

⚡️ 通常情况下,当你的服务是 IO 密集型而不是 CPU 密集型时,NodeJS 的性能比其他技术栈要好。

❓ 这是因为 NodeJS 或 JS 会将其工作交给操作系统底层线程来执行 IO 操作。

它将回调函数(一个函数)传递给该线程,并继续执行代码中的其他指令,这在专业术语中也被称为异步编程。

嗯,嗯,嗯,让我们退一步,重新理解一下我们上面写的内容:

JS 的阻塞特性

JS阻塞特性

  • Javascript 是一种单线程语言,因此一次只能处理一个任务,这与 Java 不同,Java 有多个线程来并行处理工作负载(多线程)。
  • 因此,如果一个函数/指令正在运行,下一条指令将等待该指令完成,我们不能并行运行它们。

让我们看看一条指令是如何阻塞另一条指令的:

JavaScript 阻塞特性的第一步

JavaScript 阻塞特性的第二步

JavaScript 阻塞特性的第三步

JS阻塞特性的第四步

✅ 您可以点击此处观看包含代码示例和 V8 引擎内部原理的视频讲解(英文):https ://www.youtube.com/watch?v=JN89L2SqPA8

非阻塞性质

现在,在 JS 运行时环境(NodeJS)中,我们有一些 C++ API,其中包含一些函数,例如 setTimeout、Promises、localStorage,这些函数是由操作系统线程执行的,而不是由主 JS 线程执行的。

您可以在这里看到右侧的方框,其中包含 C++ API:

C++ Nodejs API

  • 无论何时,当我们通过任何 C++ API 执行 IO 操作,例如执行 Promise、执行 HTTP 调用或数据库操作等,JS 主线程都会将主要工作交给操作系统线程,而 JS 主线程会继续处理其他代码,而不会等待异步代码运行。
  • 它提供了一个回调函数(一个函数),当调用栈为空时(调用栈中只包含同步代码,异步代码会进入微任务或任务队列)该函数将被执行。
  • 事件循环,当调用栈为空时,遍历这些队列,并将这些队列中的回调放入主栈并返回结果。

任务队列中的 Promise 执行

设置超时执行

想要深入了解 C++ 代码中 Promise 的实现方式,请参考以下视频:https ://www.youtube.com/watch? v=JN89L2SqPA8


🔥 关注我们,获取更多此类文章……

文章来源:https://dev.to/singhdevhub/javascript-promises-in-deep-with-v8-engine-internals-1jlb