【问题标题】:A little confusion in Node.jsNode.js 中的一些混乱
【发布时间】:2013-02-06 02:02:12
【问题描述】:

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

我有这段代码

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

console.log('hello');

当我开始执行这段代码时,它会立即打印出 'hello' 并在 2 秒后打印出 'world'。

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

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

我说的对吗?

请提出建议。

谢谢

【问题讨论】:

标签: node.js


【解决方案1】:

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

这个线程运行一个事件循环,总结如下:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-08-22
      • 1970-01-01
      • 2012-04-13
      • 1970-01-01
      • 2013-11-22
      • 1970-01-01
      • 1970-01-01
      • 2016-02-22
      • 1970-01-01
      相关资源
      最近更新 更多