node.js,說簡單點,基於Google V8引擎的,運行在服務器端的JavaScript。node
具備單線程、非阻塞IO、事件驅動等特性。數據庫
學習的這幾天,感覺最深的仍是非阻塞IO。因爲採用Google V8引擎,node.js能夠異步處理數據,舉個最簡單的例子。編程
1
2
3
4
5
6
7
8
|
setTimeout(function(){console.log('5')},5000);
console.log('1');
function test(){
setTimeout(function(){console.log('2')},1000);
}
test();
console.log('3');
setTimeout(function(){console.log('4')},2000);
|
若是是阻塞IO,程序按行順序執行,每行執行完再去執行下一行。服務器
運行結果爲5,1,2,3,4。運行時間約爲8000ms。異步
node.js採用非阻塞IO,程序按順序執行,但並不等待當前代碼執行完畢,即IO不阻塞。學習
1
2
3
4
5
6
|
[root@asxzy nodejs]# node test.js
1
3
2
4
5
|
運行結果爲1,3,2,4,5。運行時間約爲5000msgoogle
這就是非阻塞IO所帶來的好處,永遠不會產生死鎖,由於它自己沒有鎖機制。spa
同時,非阻塞IO也對變成帶來的一些問題:.net
過程式編程中,有不少狀況下是本句代碼要求先前的代碼執行完畢,如要調用以前處理的數據結果、和數據庫交互等。線程
node.js中能夠採用回調方式解決這個問題。
好比
1
|
setTimeout(function(){console.log('5')},5000);
|
在執行完5000ms的Timeout以後,調用function(){console.log(’5′)}
很好理解了吧!!