【问题标题】:JavaScript Internals: At what interval does the event loop run?JavaScript Internals:事件循环以什么间隔运行?
【发布时间】:2023-04-03 11:45:02
【问题描述】:

这是一个关于 JavaScript 内部的问题。

假设我有 10 个异步任务,它们都需要 x 秒才能运行。在等待响应时,脚本处于空闲状态。

JavaScript 引擎在后台询问“任务队列中是否有任何内容”。据我了解,这是一个循环。因此,事件循环。我知道在 Node 中这是用 Libuv 实现的。我读过这篇解释了一点的文章:https://nikhilm.github.io/uvbook/basics.html

为了平衡应用程序的性能,JavaScript 引擎是否对该事件循环的运行频率设置了任何限制?它是否以设定的时间间隔运行?

如果我有任何问题,请纠正我。我只是对这个事件循环运行的时间间隔感兴趣。

【问题讨论】:

  • 它运行得尽可能快
  • 如果你从一个函数中将超时设置为零,它在 V8 中每秒触发大约 250 次。其他中断源(例如 ajax)通常根本不会被“ping”,而是使用具有亚毫秒粒度的较低级别的流控制。
  • 为了平衡应用程序的性能而限制此事件循环运行的频率” - 你的意思是问他们是否人为地减慢了它?不,他们为什么要这样做?
  • @Bergi: setTimeout (et al) 是唯一一个应用粒度的“js 内部”...
  • @Bergi 根据 MDN,如果延迟值为 0,则在下一个事件周期执行该函数。

标签: javascript node.js v8 libuv


【解决方案1】:

JavaScript 端本身没有循环。但在 libuv 中有一个。基本上,libuv 会一直等到最近的计时器命中或 i/o 操作发生。然后它会在 C 中触发一个回调,调用 Node 传递的 C++ 函数,然后触发 JavaScript 代码执行。

看看this presentation,特别是从幻灯片 33 开始的部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    相关资源
    最近更新 更多