2013-02-05 49 views
1

我在Node.js技術中有一個基本的混淆。讓我用這個小例子來解釋。Node.js有點混亂

我有這樣一段代碼

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

console.log('hello'); 

當我開始執行該代碼時,它immedietely打印「你好」,2秒後它打印「世界」。

現在我只想知道,如果node.js被說成是單線程框架,那麼在哪個上下文或哪裏(線程/進程)這個setTimeout函數被執行,因爲唯一的單線程正在執行剩餘的代碼(印刷世界)。

在數據庫命中等I/O調用的情況下,node.js使用Libeio,後者在內部使用線程。所以它不是單線程的。

我對嗎?

請建議。

感謝

+0

http://stackoverflow.com/questions/7018093/nodejs-really-single-threaded – Jack

回答

2

的Node.js確實使用線程內部。當他們說它是「單線程的」時,它們表示javascript只在其中一個內部線程中運行。

這個線程運行的事件循環可以概括爲這樣:

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

setTimeout功能會在事件循環計時器,觸發它以後調用你的回調。

1

定時器在「javascript single thread」中的同一線程中執行:Understanding javascript timers

文件系統調用發生在C/C++級別。內部nodejs使用一個線程池。 libuv庫提供了該功能,因此在C/C++級別提供了異步調用。然後,node.js將公開的api暴露給「javascript單線程」。