本篇文章帶大家去理解一下Nodejs中的阻塞和非阻塞。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。
推薦學習:《nodejs 教學》
對於阻塞和非阻塞這兩個概念大家應該都有一些自己的理解:
再簡單說一下,阻塞大部分是因為同步模式造成,非阻塞可以理解為非同步模式處理一些耗時的操作
那麼再Node.js中阻塞和非阻塞是怎麼描述的呢?下面主要就這個問題去展開說明:
Node中什麼是阻塞?
I/O操作可以理解為主要是指與系統磁碟的交互(資料讀寫)或是網路請求等
阻塞就是其他JS程式碼的執行必須要等到前面的耗時的I/O操作
或一些網路請求等完成之後。因為Node有事件循環來解決這個問題,那假如說js再執行的過程中,事件循環沒有被開啟,其實就會造成阻塞的狀況發生。
其實在Node.js中正常情況下也是存在被阻塞的情況,原因是Node的異步處理針對於I/O操作比較友好【利用事件循環】,但是對於JavaScript可能存在的一些CPU密集型的操作性能就比較低。有的同學可能會說,為什麼CPU密集型的操作Node.js不能夠非同步支援呢?因為可以理解這些CPU密集型操作,其實都是一些同步程式碼,像是大量的for循環,海量的資料運算等。
Node.js的標準函式庫中也存在一些同步的方法,這些方法大部分都是基於libuv
來實作阻塞的效果。 Node的原生模組中也存在一些阻塞方法。不過同時Node也會提供對應的非同步版本的API。
什麼事libuv呢?是一個支援多平台的針對於非同步I/O操作的函式庫。詳細可見官網:https://libuv.org/
Node中什麼是非阻塞呢?
首先思考一下在不局限於Node的背景之下如何實現非阻塞(非同步)呢?
簡單說兩個:
1)可以開多個執行緒去處理並發的動作
2)事件循環的模式,如果有非同步操作放在事件佇列中,非同步操作結束之後,呼叫對應的回呼函數處理非同步回傳結果
Node.js是單執行緒的,原因是:Node.js外層是由JavaScript實現的,JavaScript的解釋執行是透過V8引擎
來做的。
既然JS的執行是單線程的,那麼我們不可能在JS解釋執行期間再開放一個線程其解釋執行吧,因此Node.js是採用第二種方式來實現非阻塞(異步操作)的。
注意不要混用Node中的阻斷與非阻塞API
#英文原文網址:https://nodejs.org/en/docs/guides/ blocking-vs-non-blocking/
更多程式相關知識,請造訪:程式設計影片! !
以上是詳解Nodejs中的阻塞和非阻塞的詳細內容。更多資訊請關注PHP中文網其他相關文章!