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