gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 00:16:10 24 4
gpt4 key购买 nike

据我所知,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秒出现一次。哪里错了?谢谢。

最佳答案

AFAIK Node.js asynchronous task is dispatched to the libuv under the hood, and the libuv has a thread pool, 4 threads is in the pool by default. I test the code below:

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

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

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

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

关于node.js - 为什么 Node.js libuv 线程池执行不是并发的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46928996/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com