AFAIK Node.js异步任务被分派到头下的libuv,而libuv有一个线程池,默认情况下4个线程在池中。 我测试下面的代码:
setImmediate(() => {
sleep(1000 * 3);
console.log('a');
});
setImmediate(() => {
sleep(1000 * 3);
console.log('b');
});
setImmediate(() => {
sleep(1000 * 3);
console.log('c');
});
function sleep(time) {
let start = new Date().getTime();
while (new Date().getTime() - start < time) {
}
}
我认为发送到libuv的3任务将同时执行,输出a / b / c几乎应该同时打印,但事实上,三个输出每3秒出现一次。 哪里错了? 感谢。
答案 0 :(得分:1)
AFAIK Node.js异步任务被分派到libuv下 引擎盖,libuv有一个线程池,4个线程在池中 默认。我测试下面的代码:
虽然并非完全错误,但也不正确。默认情况下不使用线程池。线程池仅用于同步,阻止IO任务,如文件IO和DNS查找。这些任务的回调将再次入列到JS线程。
Libuv计时器只使用普通的计时器队列。简而言之,每次创建新计时器时,库都会检查它必须等待的最短时间,等待,然后遍历所有计时器,更新它们并触发已过期的计时器的回调。然后它返回到第一步并检查它必须等待的最短时间。
您可以创建数百万个计时器,它们都可以使用相同的线程。他们不需要运行线程池。
您的程序按预期运行。回调会立即排入主JS线程,并且每个回调都会在打印一些值并继续前进之前等待3秒钟。在这种情况下,甚至没有计时器开始。我很确定setImmediate
只是将一个任务排队到事件循环队列的末尾。