當前位置:成語大全網 - 漢語詞典 - 為什麽nodejs是異步非阻塞的?

為什麽nodejs是異步非阻塞的?

阻塞輸入輸出

許多I/O操作是程序執行過程中必不可少的,比如讀寫文件、輸入輸出、請求響應等等。I/O操作是最耗時的,至少相對於代碼來說是這樣。在傳統的編程模式下,例如,如果妳想讀取壹個文件,整個線程將暫停並等待文件被讀取後再繼續執行。換句話說,I/O操作阻塞了代碼的執行,大大降低了程序的效率。

下面是壹個C#讀取文件的例子:

私有字符串ReadTxtToStr(字符串文件名)

{

//打開文件。在開放期間,其他代碼將停止執行,並繼續執行該代碼,直到開放完成。

FileStream fs = File。打開(文件名,文件模式。打開);

控制臺。WriteLine("我被打開的文件阻止了。");

StreamReader sr =新的StreamReader(fs);

//讀取文件,讀取過程中其他代碼會停止執行,繼續執行代碼,直到讀取完成。

string str = Sr . ReadToEnd();

控制臺。WriteLine("我被阻止讀取文件。");

返回字符串;

}

在上面的代碼中,兩個控制臺。WriteLine()將被執行,但它們被無辜地阻塞了壹段時間。理論上,如果讀取這個文件需要10秒,那麽我們將在I/O等待中浪費10秒(實際程序運行中很大壹部分時間浪費在I/O等待中),這在碼農眼中是天文數字。

擁有異步I/O是好的,因為I/O比大多數代碼更昂貴,我們應該做壹些比僅僅等待I/O更好的事情。

非阻塞輸入輸出

理解阻塞I/O,非阻塞I/O就好理解了。非阻塞I/O是指在程序執行過程中,I/O操作不會阻塞程序的執行,即I/O操作會繼續執行其他代碼(得益於Node的事件循環機制)。在I/O設備效率遠低於CPU的時代,這種I/O模式(非阻塞I/O)帶來的性能提升是非常可觀的。

好了,我們來感受壹下如何用Node.js實現無阻塞I/O,繼續讀文件和代碼:

var fs = require(" fs ");

fs.readFile("。/testfile "," utf8 ",函數(錯誤,文件){

if (error)拋出錯誤;

Console.log("我已經看完文件了!");

});

Console.log("我不會被屏蔽的!");

復制上面的代碼,保存為test.js,在同壹個目錄下新建壹個名為testfile的文件。使用node命令運行test.js,您將看到以下輸出:

我不會被屏蔽的!

我已經看完文件了!

這顯然不符合傳統的程序執行順序。註意,這是Node.js的非阻塞I/O。

首先說明下面這個程序。如果妳熟悉JavaScript,請忽略它。

var fs = require(" fs ");

上面的代碼:介紹Node.js中內置的文件系統模塊Require()相當於Java import和C++ include。

fs.readFile("。/testfile "," utf8 ",函數(錯誤,文件){

if (error)拋出錯誤;

Console.log("我已經看完文件了!");

});

上面的代碼:I/O操作,綁定壹個回調函數function(error,file){}到readFile,讀取testfile後執行回調函數。同時,下面的代碼繼續執行,不會被I/O阻塞。

所以才看到“我不會被屏蔽的!”然後看到“我看完文件了!”“因為。

Node.js的事件循環

《Node簡介》推薦我們讀壹讀徐覓關於事件輪詢的博文,真的很值得壹讀。我英語壹般,開著字典勉強能看懂,所以能看懂。

徐覓說過的最經典的壹句話:

除了妳的代碼,壹切都是並行運行的!

(在節點中)除了代碼,壹切都是並行的!

理解這句話再學習Node,會事半功倍!