詳解異步式(Asynchronous)IO與同步式Synchronous)IO,NodeJS代碼示例

理解IO

     IO(Input/Output)通常是指計算機線程進行慈磁盤讀寫或者網絡通信時的一種行爲。
 
同步式(Synchronous)IO和異步式(Asynchronous )IO
 
     同步式:當計算機調度線程進行I/O操作命令後,由於文件的讀寫或者網絡通信需要較長的操作時間,操作系統爲了充分利用cpu,此時會暫停到當前的I/O線程對CPU的控制(故又稱同步式爲阻塞式I/O),把cup資源然給其他的線程資源,當I/O線程完成了操作時,此時操作系統會恢復此時的I/O線程,從而當前I/O線程重新獲得了cup的的控制權,繼續完成其他操作。
     NodeJs讓很多前端開發者利用JS開發服務器變得異常的簡單,而異步式I/O則是NodeJs的一大特點。
     異步式:異步式IO又稱非阻塞式I/O,異步式與同步式不同的是,當線程進行IO操作時,操作系統並不是暫停當前的線程操作,而是執行完I/O指令後,操作系統繼續讓當前線程執行下一條指令,當I/O操作完成後,會通過事件(event)通知I/O線程,而線程在接收到通知後,會處理響應事件。
     簡單的說,同步式是讓通過多個線程完成多個任務,而異步式則是通過一個線程完成多個任務,遇到I/O操作時,依然讓線程繼續執行其他指令,只是在I/O完成後通知線程調度響應事件即可。
 
圖解:
  
示例代碼:
 
異步式:
注意這裏的異步式執行結果是,控制檯會先打印read over,然後纔打印package.json文件中的內容,也就是說,線程執行文件IO時,繼續先執行了console.log('read over'); 待讀取操作結束後通知線程響應此時的回調函數,執行了結果打印操作。
複製代碼
 1 /*
 2 * 異步式(Asynchronous) I/O Example. 7 */
 8 var file = require('fs');//聲明對象
 9 //異步式讀取
10 file.readFile('file.json','utf-8', function(error,data) {
11     if (error) {
12         console.error(error);
13     } else {
14         console.log(data);
15     }
16 });
17 //讀取結束
18 console.log("read over.");
複製代碼

運行結果:

1 >node readfile.js
2 >read over.
3 >{
4         "description" : "this is Synchronous I/O and Aynchronous I/O test."
5  }  

 

同步式:

此次執行的結果則是先讀取完package.json文件的內容並打印, 然後打印read over.
複製代碼
 1 /**
 2 * 同步式(Synchronous) I/O Example.
 3 */
 6 var file = require('fs');//聲明對象
 7 //readFileSync()方法爲NodeJs官方提供的同步式文件讀取方法,
 8 //但是官方並不推薦。
 9 var data = file.readFileSync('file.json', 'utf-8');
10 console.log(data);
11 //讀取結束
12 console.log("read over.");
複製代碼
運行結果:
  
1 >node readfile.js
2 >{
3         "description" : "this is Synchronous I/O and Aynchronous I/O test."
4    }  
5 >read over.  

 

結語: 
     通過這2段代碼的運行結果,相信大家對同步於異步的理解應該更加一目瞭然了。初次接觸Node的朋友可以去官網查看教程,安裝NodeJs,
親手嘗試嘗試NodeJs的異步編程~。如有任何疑問或者問題,歡迎聯繫我。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章