這篇文章將為大家詳細講解有關到底什么是阻塞Blocking,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
Node.js的阻塞(Blocking)與非阻塞(Non-Blocking)。我會提到EventLoop與libuv,但是不了解它們也不會影響閱讀。讀者只需要有一定的JavaScript基礎,理解Node.js的回調函數(callbackpattern)就可以了。提到了很多次I/O,它主要指的是使用libuv與系統的磁盤與網絡進行交互。
什么是阻塞(Blocking)
阻塞指的是一部分Node.js代碼需要等到一些非Node.js代碼執行完成之后才能繼續執行。這是因為當阻塞發生時,EventLoop無法繼續執行。
對于Node.js來說,由于CPU密集的操作導致代碼性能很差時,不能稱為阻塞。當需要等待非Node.js代碼執行時,才能稱為阻塞。Node.js中依賴于libuv的同步方法(以Sync結尾)導致阻塞,是最常見的情況。當然,一些不依賴于libuv的原生Node.js方法有些也能導致阻塞。
Node.js中所有與I/O相關的方法都提供了異步版本,它們是非阻塞的,可以指定回調函數,例如fs.readFile。其中一些方法也有對應的阻塞版本,它們的函數名以Sync結尾,例如fs.readFileSync。
Blocking代碼示例
阻塞的方法是同步執行的,而非阻塞的方法是異步執行。
以讀文件為例,下面是同步執行的代碼:
constfs=require('fs');
constdata=fs.readFileSync('/file.md');//文件讀取完成之前,代碼會阻塞,不會執行后面的代碼
console.log("Hello,Fundebug!");//文件讀取完成之后才會打印
對應的異步代碼如下:
constfs=require('fs');
fs.readFile('/file.md',(err,data)=>{
if(err)throwerr;
});//代碼不會因為讀文件阻塞,會繼續執行后面的代碼
console.log("Hello,Fundebug!");//文件讀完之前就會打印
第一個示例代碼看起來要簡單很多,但是它的缺點是會阻塞代碼執行,后面的代碼需要等到整個文件讀取完成之后才能繼續執行。
在同步代碼中,如果讀取文件出錯了,則錯誤需要使用try...catch處理,否則進程會崩潰。對于異步代碼,是否處理回調函數的錯誤則取決于開發者。
關于到底什么是阻塞Blocking就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。