1

我对 Node.js 技术有一个基本的困惑。让我用这个小例子来解释。

我有这段代码

setTimeout(function (){
    console.log('world');
}, 2000);

console.log('hello');

当我开始执行此代码时,它会立即打印“hello”,并在 2 秒后打印“world”。

现在我只想知道,如果说 node.js 是单线程框架,那么这个 setTimeout 函数在哪个上下文或在哪里(线程/进程)执行,因为唯一的单线程正在执行剩余的代码(打印世界) .

在像 DB hit 这样的 I/O 调用的情况下,node.js 使用 Libeio,而后者又在内部使用线程。所以它根本不是单线程的。

我对吗??

请建议。

谢谢

4

2 回答 2

2

Node.js 确实在内部使用了线程。当他们说它是“单线程”时,他们的意思是 javascript 仅在其中一个内部线程中运行。

该线程运行一个事件循环,可以总结为:

while true
    foreach events as event
         call event js callback
    endforeach
endwhile

您的setTimeout函数在事件循环中创建一个计时器,触发它稍后调用您的回调。

于 2013-02-05T16:39:46.980 回答
1

计时器在同一线程中执行,在“javascript 单线程”中:Understanding javascript timers

文件系统调用发生在 C/C++ 级别。在内部 nodejs 使用线程池。libuv库提供了该功能,因此提供了 C/C++ 级别的异步调用。然后,node.js 向“javascript 单线程”公开一个公共 api。

于 2013-02-05T18:02:12.000 回答