关于 node.js 延迟的保证

Guarantees about latency in node.js

是否明确考虑了 node.js 事件循环中任何单个请求的延迟? AFAICT 每个 IO 调用 returns 一个 eventEmitter 都会发出一个事件。通过使用 pipe 对所有事件的处理进行多路复用。因此,需要为 important 请求处理的 event 可能被放置在管道中太远的地方。是否有某种优先级队列可用于安排 eventHandlers 的执行顺序?

Here's why I asked this question in the first place。我决定给一个gist.githublink因为原因很长而且和技术问题有关

关于事件循环中的执行优先级:

  1. setImmediate() 在 setTimeout(fn, 0)
  2. 之前运行
  3. nextTick() 在下一次价格变动时触发回调(迭代)

node.js 中的事件循环本身不支持优先级。您始终可以实现自己的优先级队列或像此处一样使用现有优先级队列并将您的函数分配给优先级队列。

不清楚你在这里问的到底是什么。您的 Javascript 不会直接将内容添加到事件队列(仅使用本机代码完成)。相反,您调用一些异步操作,当异步操作完成时,该操作背后的本机代码会向事件队列添加一些内容。

这篇文章 The Node.js Event Loop, Timers, and process.nextTick() 为您提供了很多关于事件队列如何服务以及它如何处理不同类型的事件(计时器、I/O 等...)的详细信息。

一般情况下,事件类型中的事物是 FIFO(先进先出),但有一些例外。

process.nextTick() 将 运行 在等待 I/O 事件之前回调。

setImmediate() 将在等待 I/O 个事件后 运行 回调。

此处有更多详细信息:setImmediate vs. nextTick and nextTick vs setImmediate, visual explanation and setTimeout vs. setImmediate vs. nextTick

So it is possible that the event that needs to be processed for an important request may be placed too far back into the pipe.

您必须向我们展示您所关注的具体情况。如果您自己使用 setTimeout()setImmediate()process.nextTick() 安排回调,那么您可以通过选择这三个中的哪一个来控制回调何时发生。如果您不自己安排它(例如,它是某些异步操作的完成回调),那么您就无法控制它在事件循环中的安排。它将进入与其类型相匹配的子队列,并从该阶段或事件循环(如上述文章中所述)提供 FIFO。

Is there some sort of priority queue that can be used to schedule the order of execution of eventHandlers ?

没有公开的优先级系统。在事件类型中,事物是 FIFO。同样,如果您给我们一个实际的编码示例,以便我们可以准确地看到您正在尝试做什么,我们可以就您的选择提供一些帮助。您可以使用已经可用的 setTimeout()setImmediate()process.nextTick() 工具,或者您可能希望实施自己的 运行 关闭的任务排队和优先级系统上述三种方法中的一些方法可以让您自己确定已经排队的事物的优先级。