您好,登錄后才能下訂單哦!
這篇文章主要介紹了Nodejs中阻塞和非阻塞的示例分析,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
對(duì)于阻塞和非阻塞這兩個(gè)概念大家應(yīng)該都有一些自己的理解:
再簡單說一下,阻塞大部分是由于同步模式造成,非阻塞可以理解為異步模式處理一些耗時(shí)的操作
那么再Node.js中阻塞和非阻塞是怎么描述的呢?下面主要就這個(gè)問題去展開說明:
Node中什么是阻塞?
I/O操作可以理解為主要是指與系統(tǒng)磁盤的交互(數(shù)據(jù)讀寫)或者是網(wǎng)絡(luò)請(qǐng)求等
阻塞就是其他JS代碼的執(zhí)行必須要等到前面的耗時(shí)的I/O操作
或者一些網(wǎng)絡(luò)請(qǐng)求等完成之后。因?yàn)镹ode存在事件循環(huán)來解決這個(gè)問題,那假如說js再執(zhí)行的過程中,事件循環(huán)沒有被開啟,其實(shí)就會(huì)造成阻塞的情況發(fā)生。
其實(shí)在Node.js中正常情況下也是存在被阻塞的情況,原因是Node的異步處理針對(duì)于I/O操作比較友好【利用事件循環(huán)】,但是對(duì)于JavaScript可能存在的一些CPU密集型的操作性能就比較低。有的同學(xué)可能會(huì)說,為什么CPU密集型的操作Node.js不能夠異步支持呢?因?yàn)榭梢岳斫膺@些CPU密集型操作,其實(shí)都是一些同步代碼,比如大量的for循環(huán),海量的數(shù)據(jù)計(jì)算等。
Node.js的標(biāo)準(zhǔn)庫中也存在一些同步的方法,這些方法大部分都是基于libuv
來實(shí)現(xiàn)阻塞的效果。Node的原生模塊中也存在一些阻塞方法。不過同時(shí)Node也會(huì)提供對(duì)應(yīng)的異步版本的API。
什么事libuv呢? 是一個(gè)支持多平臺(tái)的針對(duì)于異步I/O操作的庫。 詳細(xì)可見官網(wǎng):https://libuv.org/
Node中什么是非阻塞呢?
首先思考一下在不局限于Node的背景之下如何實(shí)現(xiàn)非阻塞(異步)呢?
簡單說兩個(gè):
1)可以開多個(gè)線程去處理并發(fā)的操作
2)事件循環(huán)的模式,如果有異步操作放在事件隊(duì)列中,異步操作結(jié)束之后,調(diào)用對(duì)應(yīng)的回調(diào)函數(shù)處理異步返回結(jié)果
Node.js是單線程的,原因是:Node.js外層是由JavaScript實(shí)現(xiàn)的,JavaScript的解釋執(zhí)行是通過V8引擎
來做的。
既然JS的執(zhí)行是單線程的,那么我們不可能在JS解釋執(zhí)行期間再開放一個(gè)線程其解釋執(zhí)行吧,因此Node.js是采用第二種方式來實(shí)現(xiàn)非阻塞(異步操作)的。
注意不要混用Node中的阻塞和非阻塞API
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Nodejs中阻塞和非阻塞的示例分析”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。