为什么Node.js libuv线程池执行不兼容?

AFAIK Node.jsasynchronous任务被调度到libuv下,libuv有一个线程池,默认情况下有4个线程在池中。 我testing下面的代码:

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

AFAIK Node.jsasynchronous任务被调度到libuv的底层,libuv有一个线程池,默认情况下有4个线程在池中。 我testing下面的代码:

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

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

您可以创build数百万个定时器,并且都可以使用相同的线程。 他们不需要一个线程池来运行。

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