【问题标题】:Does Node.js prioritize I/O event over setTimeout()?Node.js 是否将 I/O 事件优先于 setTimeout()?
【发布时间】:2015-01-20 14:35:02
【问题描述】:

关于 Node.js 如何处理由 setTimeout 安排的调用的文档不是很清楚:

Node.js 不保证何时执行 回调将触发,排序的东西也不会触发。 回调将在尽可能接近指定的时间被调用。

假设有一个过期的计时器。还有一些 I/O 事件等待处理。 Node.js 会选择在触发计时器之前先处理所有 I/O 事件吗?这就是 WM_TIMER 在 Windows 中的工作方式。我猜 Node.js 的行为方式可能相同。否则为什么会有setImmediate()?人们可以使用延迟为 0 的 setTimeout()。

【问题讨论】:

    标签: node.js


    【解决方案1】:

    定时器当前在 I/O 处理程序之前处理。此外,如果您执行setTimeout(fn, 0),节点会为下一个刻度安排该函数。

    这是一张较旧的图表,大致显示了事件循环的一个循环中发生的情况:

    虽然有些东西,例如关于process.maxDepth 的注释在节点 v0.11+/iojs 中不再是这种情况。

    【讨论】:

      【解决方案2】:

      node.js(实际上是 libuv)中的事件循环有几个阶段。在每个阶段处理一些特定类型的事件。当所有回调都被调用时,循环进入下一阶段:https://github.com/libuv/libuv/blob/v1.x/src/unix/core.c#L314

      这意味着一种类型的事件不能抢占另一种类型的事件。基本上没有单个队列,而是每个阶段的队列。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-21
        • 2013-12-16
        • 1970-01-01
        • 1970-01-01
        • 2021-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多