为什么Node.js libuv线程池执行不同时?

时间:2017-10-25 09:38:58

标签: node.js multithreading libuv

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秒出现一次。 哪里错了? 感谢。

1 个答案:

答案 0 :(得分:1)

  

AFAIK Node.js异步任务被分派到libuv下   引擎盖,libuv有一个线程池,4个线程在池中   默认。我测试下面的代码:

虽然并非完全错误,但也不正确。默认情况下不使用线程池。线程池仅用于同步,阻止IO任务,如文件IO和DNS查找。这些任务的回调将再次入列到JS线程。

Libuv计时器只使用普通的计时器队列。简而言之,每次创建新计时器时,库都会检查它必须等待的最短时间,等待,然后遍历所有计时器,更新它们并触发已过期的计时器的回调。然后它返回到第一步并检查它必须等待的最短时间。

您可以创建数百万个计时器,它们都可以使用相同的线程。他们不需要运行线程池。

您的程序按预期运行。回调会立即排入主JS线程,并且每个回调都会在打印一些值并继续前进之前等待3秒钟。在这种情况下,甚至没有计时器开始。我很确定setImmediate只是将一个任务排队到事件循环队列的末尾。