为什么在主模块中使用setTimeout(0)和setImmediate()的行为未定义?

从nodejs事件循环文档中取下面的代码:

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

根据文件:

例如,如果我们运行以下不在I / O周期内的脚本(即主模块),则两个定时器的执行顺序是非确定性的,因为它受过程执行的约束。

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

我的直觉是这样说的:有两个线程为setTimeoutsetImmediate执行callback,所以当两者都可用时,这会导致竞争条件,因此输出将是非确定性的。

这是对的吗 ? 或者还有什么其他的原因是不确定的?