站長資訊網
        最全最豐富的資訊網站

        Node.js中什么是非阻塞I/O?通過示例來理解!

        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由于有多個服務員,一對一的服務,即使有一個發生意外,也不會影響整體質量,而雇多個服務員也要相應的付出成本。

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 免费视频精品一区二区| 亚洲AV永久纯肉无码精品动漫| 亚洲电影日韩精品| 99久久这里只有精品| 亚洲国产一成人久久精品| 国产精品永久久久久久久久久| 久久99国产乱子伦精品免费| 无翼乌无遮挡全彩老师挤奶爱爱帝国综合社区精品 | 四虎国产精品成人免费久久| 91自慰精品亚洲| 9久久9久久精品| xxx国产精品视频| 国产亚洲欧美精品永久| 四虎国产精品成人| 男女男精品视频网站在线观看| 精品久久国产一区二区三区香蕉| 四虎成人精品免费影院| 97国产精品视频| 99re6这里有精品热视频| 国产精品亚洲一区二区三区在线| 亚洲级αV无码毛片久久精品| 一本久久精品一区二区| 亚洲精品WWW久久久久久| 欧美ppypp精品一区二区| 精品久久久久久99人妻| 久久精品国产一区二区电影| 精品国产爽爽AV| 国产在线精品观看免费观看| 国产精品伊人久久伊人电影| 大胸国产精品视频| 国产精品部在线观看| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 亚洲综合国产精品第一页| 欧洲精品码一区二区三区免费看| 久久久久这里只有精品 | 精品久久久久久久久久中文字幕| 99久久伊人精品综合观看| 国产成人精品免费视频大全| 国产成人精品免费大全| 久久se精品一区二区影院 | 囯产精品一品二区三区|