采取以下从nodejs event loop documentation提取的代码:

// timeout_vs_immediate.js
setTimeout(() => {
  console.log('timeout');
}, 0);

setImmediate(() => {
  console.log('immediate');
});

根据文档:



为什么上述说法是正确的?是因为nodejs运行时实际上使用了多个线程来挑选必须执行的回调。

我的直觉是什么:有两个线程执行setTimeoutsetImmediate的回调,因此当它们均可用时,这会导致竞争状态,因此输出将是不确定的。

这是正确的吗 ?还是有其他原因导致不确定性?

最佳答案

本质上,发生两件事:

  • setTimer(0 ..)转换为setTimer(1 ..)
  • 在(下一个)事件循环刻度开始之前,使用
  • ,node/libuv必须执行clock_gettime()才能从系统获取当前时间。该系统调用所花费的时间是不确定的,因为它取决于当时的系统负载。现在,如果clock_gettime()花费的时间超过1毫秒,则setTimer回调将运行(#),否则事件循环将继续进行到下一阶段(##)。
  • 如果是(#),则在setImmediate()
  • 之前运行setTimeout(0,..)回调
  • 如果是(##),则为否则。

  • 引用:
    https://github.com/nodejs/help/issues/392#issuecomment-305969168

    关于javascript - 在主模块中使用setTimeout(0)和setImmediate()时,为什么行为未定义?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45934350/

    10-11 08:57