【发布时间】:2021-04-15 12:46:37
【问题描述】:
假设我有 3 个 setTimeouts,如下所示:
console.log(new Date().toLocaleTimeString());
setTimeout(() => { console.log(new Date().toLocaleTimeString()); }, 3000);
setTimeout(() => { console.log(new Date().toLocaleTimeString()); }, 6000);
setTimeout(() => { console.log(new Date().toLocaleTimeString()); }, 9000);
由于 Node 是单线程的,每个超时的执行应该一个接一个。因此,输出应如下所示:
9 am 0s (intial)
9 am 3s(+3s)
9 am 9s(+6s)
9 am 18s(+9s)
但我发现的是:
9 am 0s (initial)
9 am 3s(+3s)
9 am 6s(+3s)
9 am 9s(+3s)
所以很明显,所有超时都是同时开始的。每个超时之间的差异被添加到每个超时之间,在这种情况下是 +3s,
在这种情况下,这会使 nodejs 成为多线程吗?我确实知道并非节点的所有部分都在同一个线程中运行,并且很少会在同一个线程之外执行。
有人可以在这方面给我一个更好的感觉吗?或者也许我的方法是错误的。
【问题讨论】:
-
JS 是基于事件的。其他代码可以在超时未决时运行(它是异步的)
-
setTimeout()调用在很短的时间内一个接一个地运行。第一次调用的延迟值对第二次调用的延迟没有影响(嗯,影响很小)。 -
@blex 我知道需要 node api 的函数确实是异步执行的,我是在 node api 内询问执行 ..
-
@ViswanadhDeepak 不是全部。但通常需要回调的函数(
forEach、map等除外) -
@Pointy 是的,我确实注意到 setTimeout() 调用是在非常微小的时间差异上进行的......如果我们考虑缩放到秒,那么这些调用是同时进行的......
标签: javascript node.js multithreading settimeout