为什么Node.js libuv线程池执行不是并发的?

为什么Node.js libuv线程池执行不是并发的?,node.js,multithreading,libuv,Node.js,Multithreading,Libuv,AFAIK Node.js异步任务被分派到引擎盖下的libuv,libuv有一个线程池,默认情况下池中有4个线程。 我测试下面的代码: setImmediate(()=>{ 睡眠(1000*3); console.log('a'); }); setImmediate(()=>{ 睡眠(1000*3); console.log('b'); }); setImmediate(()=>{ 睡眠(1000*3); console.log('c'); }); 功能睡眠(时间){ 让开始=新日期().get

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

setImmediate(()=>{
睡眠(1000*3);
console.log('a');
});
setImmediate(()=>{
睡眠(1000*3);
console.log('b');
});
setImmediate(()=>{
睡眠(1000*3);
console.log('c');
});
功能睡眠(时间){
让开始=新日期().getTime();
while(new Date().getTime()-start
我认为发送到libuv的3个任务将同时执行,输出a/b/c应该几乎同时打印,但事实上,这三个输出每3秒显示一次。 哪里错了? 谢谢

AFAIK Node.js异步任务被调度到 并且libuv有一个线程池,池中有4个线程 违约我测试下面的代码:

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

Libuv计时器只使用普通的计时器队列。简而言之,每次创建新计时器时,库都会检查它必须等待的最短时间,等待,然后迭代所有计时器,更新它们,并对过期的计时器进行回调。然后它返回到步骤1,并检查它必须等待的最短时间

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

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