
這本書是市面上講nodejs的一本不可多得的入門書,當初想學 nodejs的時候,找了半天,終於找到了這本好書,隨后一發不可收拾,花了一兩天的功夫就看玩了,感覺作者系統功力深厚,以下只是偶的一些摘要,權當心得體會。
書里說nodejs的核心特性是異步IO,事件驅動,任何IO操作都是由事件來驅動的。
說到異步IO又不得不來看看操作系統的線程與阻塞。
什么是阻塞呢,線程在執行中遇到磁盤讀寫或者數據庫通訊,網絡通訊這種耗時比較多的時候,操作系統將會剝奪此線程的CPU資源,並暫停此線程,轉而去執行別的線程,此線程調度方式稱為阻塞。當 I/O操作完成之后,操作系統又恢復此線程,讓其繼續執行,這種I/O模式通常稱為同步I/O或者阻塞式I/O。
異步式IO或者非阻塞式I/O則針對所有操作采取不阻塞的方式,當線程遇到IO操作的時候,不會以阻塞的方式等待IO操作完成或者數據的返回,而是將IO操作發送給操作系統,然后接着執行下一個操作,當操作系統執行完IO操作之后,將是事件的方式通知執行IO的線程,線程會在特定的時候執行這個事件。這一切的前提條件就是,系統需要一個事件循環,以不斷的去查詢有沒有未處理的事件,然后給預處理。
阻塞方式下,一個線程只能處理一個任務,要想提高系統的吞吐量,必須使用多線程 ;而非阻塞情況下,一個線程永遠在執行計算,CPU使用率幾乎100%,IO以事件的方式通知。在阻塞模式下,多線程能夠提高系統吞吐量,因為一個線程在阻塞的時候,還有另一個線程在工作,多線程 不會讓CPU資源在線程阻塞的時候浪費。而在非阻塞模式下,線程不會被IO阻塞,CPU資源也不會浪費。多線程只是在多核的時候利用更多的核,而nodejs的單線程也能帶來這個好處。 所以這就是nodejs采取單線程,非阻塞的事件編程模式。
以下是書中的兩幅圖,


再弄一個同步式IO與異步式IO的特點比較,依然用書中的圖

最后以異步讀取一個本地的文件來結束本文,:)
//demo.js
//加載文件模塊
var fs=require('fs');
fs.readFile('a.txt','utf-8',function(err,data){
if (err){
console.log(err)
}else{
console.log(data);
}
});
console.log('there is firstprint');
以上代碼,可以在命令行中,切換到demo.js的目錄中,輸入node demo.js回車即可運行看到結果。
