0

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

这就是我首先问这个问题的原因。我决定给出一个 gist.github 链接,因为原因很长并且与技术问题有关

4

2 回答 2

1

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

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

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

于 2017-06-25T03:58:16.667 回答
1

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

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

通常,事件类型中的事物是 FIFO(先进先出),但有一些例外。

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

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

更多细节在这里:setImmediate vs. nextTicknextTick vs. setImmediate,视觉解释setTimeout vs. setImmediate vs. nextTick

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

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

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

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

于 2017-06-25T04:19:41.667 回答