【问题标题】:The implementaiton of event loop with Libuv or Libevent on v8, why is it necessary?v8 上用 Libuv 或 Libevent 实现事件循环,为什么需要?
【发布时间】: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


【解决方案1】:

坦率地说,这也是我第一次知道事件循环组件不是 v8 的一部分。

但我不知道我们可以将其从 v8 中删除。我知道我不权威,但我在这里与您分享我的理解:

你之前的思维模型是这样的,v8 积极忙循环来检查继续信号。

在新模型中,这个责任只是转移到了 libuv,v8 向 libuv 注册了一个回调,说“我正在等待某个文件/网络/超时 IO 中断的信号,当它发生时给我回电”,然后 v8 进入睡眠状态,让 libuv 忙于循环。

当该信号到达时,libuv 回调到 v8 以唤醒它,并且 v8 继续执行 JS 任务。所以不是,libuv 不执行 JavaScript,它仍然是 v8。

唯一改变的是循环代码的放置位置。这只是在哪里划定软件组件之间的界限的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-05
    • 2019-01-15
    • 2014-10-31
    • 1970-01-01
    相关资源
    最近更新 更多