Node.js是否优先于setTimeout()的I / O事件?

时间:2015-01-20 14:35:03

标签: node.js

关于Node.js如何处理setTimeout调度的调用的文档并不十分清楚:

  

Node.js不保证确切的时间   回调会发射,也不会发出命令   回调将尽可能接近指定时间。

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

2 个答案:

答案 0 :(得分:1)

当前的计时器在I / O处理程序之前处理。此外,如果您执行setTimeout(fn, 0),节点会安排下一个时钟的功能。

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

node.js event loop diagram

虽然在节点v0.11 + / iojs中不再出现诸如关于process.maxDepth的注释之类的事情。

答案 1 :(得分:0)

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

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