【发布时间】:2021-10-30 11:55:31
【问题描述】:
Javascript Web 应用程序有一个事件循环来处理调用堆栈,它会循环检查浏览器的 Web API 返回的任何任务队列,以便在调用堆栈空闲时运行。我将使用 v8 作为 javascript 引擎的示例。
我一直把这个调用栈想象成 V8 引擎的一部分,它最终将我们的 Javascript 作为一个同步程序来执行。任何将多线程操作委托给 libuv/libevent 等 API 的操作都必须通过异步处理返回到 V8 执行调用堆栈。
但最近,我阅读了 chromium 和 node.js 使用 libevent/libuv 提供的事件循环,而不是 v8 实现。这部分确实有点与我的心理模型相混淆。事件循环是在 v8 中获得异步处理的完美解决方案,我们等待 API 将队列返回给我们的宏/微任务,并通过围绕优先级检查的下一个循环执行它们。
为什么我们需要将它从 v8 中移除(因为大多数图表显示事件循环驻留在 v8 之外)?如果事件循环在 v8 之外,这是否意味着 v8 不再执行 javascript 代码,而是执行我们的 Javascript 程序和各个库提供的其他代码的外部事件循环?
【问题讨论】:
-
愿意分享您参考的文章吗?
-
@hackape 这是 Sujeet Agrahari 在link 的回答。
-
对于浏览器来说,这仅仅是因为它们不是用 JavaScript 编写的。浏览器所做的大部分事情都不是由 JavaScript 驱动的。为什么他们会依赖 V8 的小型事件循环实现? HTML 的事件循环要复杂得多。
-
@kaiido HTML 的事件循环?我知道浏览器提供了许多工具,这些工具可以在单独的线程上进行各种专门的操作。但无论从我们开发的 Javascript 程序的角度来看,它不应该只需要一个简单的事件循环来等待并将这些 API 的结果捕获回我们的 v8 调用堆栈吗?
-
这不是真正的“与...对话的事件循环”,而是能够处理各种任务源的事件循环,具有优先级、复合任务、由监视器驱动的渲染阶段刷新率,还有很多其他的东西。所以是的,他们最好实现自己的偶数循环,而不是依赖 V8 中的基本循环。
标签: javascript node.js implementation libuv libevent