深入了解 JavaScript Promise 与 V8 引擎内部原理
😅 由于 JavaScript 或 NodeJS 是单线程语言,大多数人认为它们速度慢且可扩展性差。而 Python 和 JS 则恰恰相反:
这要看情况。如果你的服务是 I/O 密集型的(例如文件读取、数据库调用、HTTP 调用等输入输出操作),这意味着它依赖于其他资源的读取或写入。
⚡️ 通常情况下,当你的服务是 IO 密集型而不是 CPU 密集型时,NodeJS 的性能比其他技术栈要好。
❓ 这是因为 NodeJS 或 JS 会将其工作交给操作系统底层线程来执行 IO 操作。
它将回调函数(一个函数)传递给该线程,并继续执行代码中的其他指令,这在专业术语中也被称为异步编程。
嗯,嗯,嗯,让我们退一步,重新理解一下我们上面写的内容:
JS 的阻塞特性
- Javascript 是一种单线程语言,因此一次只能处理一个任务,这与 Java 不同,Java 有多个线程来并行处理工作负载(多线程)。
- 因此,如果一个函数/指令正在运行,下一条指令将等待该指令完成,我们不能并行运行它们。
让我们看看一条指令是如何阻塞另一条指令的:
✅ 您可以点击此处观看包含代码示例和 V8 引擎内部原理的视频讲解(英文):https ://www.youtube.com/watch?v=JN89L2SqPA8
非阻塞性质
现在,在 JS 运行时环境(NodeJS)中,我们有一些 C++ API,其中包含一些函数,例如 setTimeout、Promises、localStorage,这些函数是由操作系统线程执行的,而不是由主 JS 线程执行的。
您可以在这里看到右侧的方框,其中包含 C++ API:
- 无论何时,当我们通过任何 C++ API 执行 IO 操作,例如执行 Promise、执行 HTTP 调用或数据库操作等,JS 主线程都会将主要工作交给操作系统线程,而 JS 主线程会继续处理其他代码,而不会等待异步代码运行。
- 它提供了一个回调函数(一个函数),当调用栈为空时(调用栈中只包含同步代码,异步代码会进入微任务或任务队列)该函数将被执行。
- 事件循环,当调用栈为空时,遍历这些队列,并将这些队列中的回调放入主栈并返回结果。
想要深入了解 C++ 代码中 Promise 的实现方式,请参考以下视频:https ://www.youtube.com/watch? v=JN89L2SqPA8
🔥 关注我们,获取更多此类文章……
文章来源:https://dev.to/singhdevhub/javascript-promises-in-deep-with-v8-engine-internals-1jlb








