我对Node.js技术有一个根本的困惑。让我用这个小例子来解释。
我有这段代码
setTimeout(function (){
console.log('world');
}, 2000);
console.log('hello');
当我开始执行此代码时,它立即打印'hello',并在2秒后打印'world'。
现在我只想知道如果说node.js是单线程框架,那么在哪个上下文或者哪个(线程/进程)这个setTimeout函数被执行,因为唯一的单个线程正在执行剩下的代码(印刷世界)。
如果像DB命中一样进行I / O调用,node.js会使用Libeio,后者又在内部使用线程。所以它根本不是单线程的。
我是对的吗?
请建议。
由于
答案 0 :(得分:2)
Node.js确实在内部使用线程 。当他们说它是“单线程”时,他们意味着javascript只在其中一个内部线程中运行。
这个线程运行一个事件循环,可以这样总结:
while true
foreach events as event
call event js callback
endforeach
endwhile
你的setTimeout
函数在事件循环中创建一个计时器,触发它以便稍后调用你的回调。
答案 1 :(得分:1)
定时器在“javascript单线程”中的同一个线程中执行:Understanding javascript timers。
文件系统调用发生在C / C ++级别。内部nodejs使用一个线程池。 libuv库提供了该功能,因此提供了C / C ++级别的异步调用。然后,node.js将公共api暴露给“javascript单线程”。