首頁  >  文章  >  web前端  >  Node.js中什麼是非阻塞I/O?透過範例來理解!

Node.js中什麼是非阻塞I/O?透過範例來理解!

青灯夜游
青灯夜游轉載
2021-08-13 10:55:392318瀏覽

Node.js中什麼是非阻塞I/O?本篇文章透過範例帶大家了解Node.js中的是非阻塞I/O,希望對大家有幫助!

Node.js中什麼是非阻塞I/O?透過範例來理解!

寫在最前面

老早就想學Node.js了,覺得前端一定要是懂服務端知識,並且可以自己獨立完成一個小型全端專案的,但是礙於時間因素,上學期學了點基礎之後,就再也沒空學,正好今天科二過了,Node.js我又來卷你了! ! ! 【推薦學習:《nodejs 教學》】

  • #I/O就是input/output,一個系統的輸入輸出
  • 阻斷I/O和非阻塞I/O的差別就在於系統的接收輸入,在到輸出期間,能不能接收其他輸入

舉個栗子

  • 去食堂吃飯:我們都要排隊吃飯

    我們的流程是:排隊------>等前面的人吃飯--- ----->輪到我們自己吃飯------->開始吃飯

  • 出去吃飯:餐廳點菜

    現在我們的流程是:坐下------->點菜------->等待-------->開始吃飯

    嘗試開始在markdown中使用一些奇怪的東西

  • 排隊吃飯vs 餐廳點菜

  • 對於點菜人員的我們來說:

    • 排隊吃飯是阻塞I/O
    • 餐廳點菜是非阻塞I/O

繼續來看最上面那句話:

系統的接收輸入,在到輸出期間,能不能接收其他輸入

在栗子中,系統=食堂打飯的阿姨或餐廳服務生,輸入=點菜,輸出=端菜(上菜)

食堂阿姨只能一份一份的打飯---------> 阻塞I/O

服務生點完菜之後還可以服務其他客人------->非阻塞I/O

其實,這個問題小學老師就教過我們

小芳幫媽媽做家務,需要做:用洗衣機洗衣服(20分鐘)、掃地(10分鐘)、整理書桌(10分鐘)、晾衣服(5分鐘)。你能不能設計出一個巧妙合理的新順序,讓小芳最少花(      )分鐘才能完成這些事?

A.20

B.25

C.30

D.35

沒想到吧? (其實我也沒想到~)

在這個過程中,我們用洗衣機洗衣服=輸入,晾衣服=輸出,在洗衣機洗衣服的過程中,我們是可以去做其他事情的,所以這個屬於非阻塞I/O喲。

思考

理解非阻塞I/O,首先要確定的是什麼?

  • 我們要確定有一個輸入/輸出(input/output)的系統。
  • 思考在I/O過程中,能不能進行其他I/O。
    • 能------>非阻塞
    • 不能------->阻塞

寫栗子

先新建一個index.js,再開啟我們前端人的vs-code,開啟終端,執行npm install glob安裝一個glob包,來幫我們更方便去觀察I/O是否阻塞。

先來看阻塞I/O

程式碼先貼上:index.js

const glob = require('glob');

var result = null;
console.time('glob')
result = glob.sync(__dirname + '/**/*')
console.timeEnd('glob')
console.log(result)

首先,先用require引進我們的glob包,接下來,用glob.sync去做一個列印目錄的一個操作,將結果列印的同時,利用time/timeEnd,去記錄時間,看node執行這個操作共花費多少時間。

在終端機輸入node index.js直接執行這個檔案

Node.js中什麼是非阻塞I/O?透過範例來理解!

#看第一行,在我的電腦上執行共花費20.93毫秒啊,這個數字在一個服務端來說,已經不小了。

再看非阻塞I/O

直接上程式碼:

const glob = require('glob');
var result = null;
console.time('glob')
glob(__dirname + '/**/*',function(err,res){
    result = res;
    // console.log(result)
    console.log('got result');
})
console.timeEnd('glob')
console.log('今天你卷了没?')

這次採用一個回呼函數的方式來操作,因為result的列印出來實在太多行了,我們將其替換為打印出'got result',並在計時完成後進行一個打印語句的操作,讓我們來看看結果:

Node.js中什麼是非阻塞I/O?透過範例來理解!

##首先還是我們的時間:3.258ms,跟之前的20.93比起來,簡直少了不要太多好嘛,完後是我們輸出的語句,最後才打印了我們想要的操作結果,也就是說,它在輸入輸出之間進行了別的操作,對結果無影響,用時少了很多!

結論

我的理解:非阻塞I/O讓我們減少了許多等待的時間,並且在等待時間內,我們還可以進行一些其他的操作(歡迎大佬給予指點!!!!)

凡事沒有絕對,不是說非阻塞I/O就一定是好的,還是拿餐廳舉例子,比如服務員中間發生意外,所有的客人都要等這一個服務員,這樣就會影響餐廳整體品質(可以理解為服務器奔潰);阻塞I/O由於有多個服務員,一對一的服務,即使有一個發生意外,也不會影響整體質量,而僱多個服務員也要相應的付出成本。

更多程式相關知識,請造訪:程式設計入門! !

以上是Node.js中什麼是非阻塞I/O?透過範例來理解!的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:掘金--Ned。如有侵權,請聯絡admin@php.cn刪除