保证node.js中的延迟

时间:2017-06-25 03:51:45

标签: node.js latency starvation

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

Here's why I asked this question in the first place。我决定给出一个gist.github链接,因为原因很长并且与技术问题有关

2 个答案:

答案 0 :(得分:1)

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

  1. setImmediate()在setTimeout(fn,0)
  2. 之前运行
  3. nextTick()在下一个tick(迭代)
  4. 时触发回调

    本地,node.js中的事件循环不支持优先级。您始终可以实现自己的优先级队列或使用现有的优先级队列,并将您的功能分配给优先级队列。

答案 1 :(得分:1)

目前尚不清楚你在这里问的确切内容。您的Javascript不会直接向事件队列添加内容(仅使用本机代码完成)。相反,您调用一些异步操作,并且当异步操作完成时,该操作后面的本机代码会向事件队列添加一些内容。

本文The Node.js Event Loop, Timers, and process.nextTick()为您提供了有关如何处理事件队列以及如何处理不同类型事件(定时器,I / O等等)的大量详细信息。

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

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

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

此处提供更多详细信息:setImmediate vs. nextTicknextTick vs setImmediate, visual explanation以及setTimeout vs. setImmediate vs. nextTick

  

因此,可能需要为重要请求处理的事件可能会被放回管道中。

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

  

是否有某种优先级队列可用于安排eventHandlers的执行顺序?

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