IO阻塞

126 阅读1分钟

最近在学习node

在Node源码的deps/uv/src/timer.c中141行,有一个 uv__next_timeout 的函数;

这个函数决定了,poll阶段要不要阻塞在这里;

阻塞在这里的目的是当有异步IO被处理时,尽可能快的让代码被执行;

如果事件循环开启的时间(ms)是小于 setTimeout函数的执行时间的;

也就意味着先开启了event-loop,但是这个时候执行到timer阶段,

并没有 定时器的回调被放到入 timer queue中;

所以没有被执行,后续开启定时器和检测到有setImmediate时,就会跳过 poll阶段,向后继续执行;

这个时候是先检测 setImmediate,第二次的tick中执行了timer中的 setTimeout;

如果事件循环开启的时间(ms)是大于 setTimeout函数的执行时间的;

p这就意味着在第一次 tick中,已经准备好了timer queue;

  所以会直接按照顺序执行即可;