站長資訊網(wǎng)
        最全最豐富的資訊網(wǎng)站

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

        Node.js中什么是非阻塞I/O?本篇文章通過例子帶大家了解一下Node.js中的是非阻塞I/O,希望對大家有所幫助!

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

        寫在最前

        老早就想學(xué)Node.js了,覺得前端一定要是懂服務(wù)端知識(shí),并且可以自己獨(dú)立完成一個(gè)小型全棧項(xiàng)目的,但是礙于時(shí)間因素,上學(xué)期學(xué)了點(diǎn)基礎(chǔ)之后,就再也沒空學(xué),正好今天科二過了,Node.js我又來卷你了!!!【推薦學(xué)習(xí):《nodejs 教程》】

        • I/O就是input/output,一個(gè)系統(tǒng)的輸入輸出
        • 阻塞I/O和非阻塞I/O的區(qū)別就在于系統(tǒng)的接收輸入,在到輸出期間,能不能接收其他輸入

        舉個(gè)栗子

        • 去食堂吃飯:我們都要排隊(duì)打飯

          我們的流程是:排隊(duì)——>等前面的人打飯——–>輪到我們自己打飯——->開始吃飯

        • 出去吃飯:餐廳點(diǎn)菜

          現(xiàn)在我們的流程是:坐下——->點(diǎn)菜——->等待——–>開始吃飯

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

        • 排隊(duì)打飯 vs 餐廳點(diǎn)菜

        • 對于點(diǎn)菜人員的我們來說:

          • 排隊(duì)打飯是阻塞I/O
          • 餐廳點(diǎn)菜是非阻塞I/O

        繼續(xù)來看最上面那句話:

        系統(tǒng)的接收輸入,在到輸出期間,能不能接收其他輸入

        在栗子中,系統(tǒng)=食堂打飯的阿姨或者是餐廳服務(wù)生,輸入=點(diǎn)菜,輸出=端菜(上菜)

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

        服務(wù)生點(diǎn)完菜之后還可以服務(wù)其他客人——->非阻塞I/O

        其實(shí),這個(gè)問題小學(xué)老師就教過我們

        小芳幫媽媽做家務(wù),需要做:用洗衣機(jī)洗衣服(20分鐘)、掃地(10分鐘)、整理書桌(10分鐘)、晾衣服(5分鐘)。你能不能設(shè)計(jì)一個(gè)巧妙合理的新順序,使小芳最少花( )分鐘可以完成這些事?

        A.20

        B.25

        C.30

        D.35

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

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

        思考

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

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

        寫個(gè)栗子

        先新建一個(gè)index.js,再打開我們前端人的vs-code,打開終端,執(zhí)行npm install glob安裝一個(gè)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去做一個(gè)打印目錄的一個(gè)操作,將結(jié)果打印的同時(shí),利用time/timeEnd,去記錄時(shí)間,看node執(zhí)行這個(gè)操作共花費(fèi)多少時(shí)間。

        在終端輸入node index.js直接運(yùn)行這個(gè)文件

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

        看第一行,在我的電腦上執(zhí)行共花費(fèi)20.93毫秒啊,這個(gè)數(shù)量在一個(gè)服務(wù)端來說,已經(jīng)不小了。

        再看非阻塞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('今天你卷了沒?')

        這次采用一個(gè)回調(diào)函數(shù)的方式來進(jìn)行操作,因?yàn)閞esult的打印出來實(shí)在太多行了,我們將其替換為打印出'got result',并在計(jì)時(shí)完成后進(jìn)行一個(gè)打印語句的操作,讓我們來看看結(jié)果:

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

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

        結(jié)論

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

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

        贊(0)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
        主站蜘蛛池模板: 久久精品国产亚洲AV电影| 99国产精品无码| 熟妇无码乱子成人精品| 久久香蕉超碰97国产精品| 国产高清在线精品一区小说 | 国产精品国产精品国产专区不卡 | 九九热这里只有国产精品| 国产精品一区二区久久| 色偷偷88888欧美精品久久久| 精品久久久久中文字| 欧美巨大黑人精品videos| 国产精品人成在线播放新网站| 伊人久久综合精品无码AV专区| 精品人妻人人做人人爽| 亚洲国产91精品无码专区| 国模精品一区二区三区| 欧美性videofree精品| 国产国产精品人在线视| 日本VA欧美VA欧美VA精品| 午夜三级国产精品理论三级 | 国产福利精品一区二区| 无码国产69精品久久久久网站| 亚洲国产精品国产自在在线 | 国产精品自在线拍国产第一页| 五月花精品视频在线观看 | 99精品热这里只有精品| 久久99精品久久久久久动态图| 亚洲欧洲美洲无码精品VA| 亚洲精品无码AV中文字幕电影网站| 欧美成人精品高清在线播放 | 国产精品久久久久久影院 | 91视频精品全国免费观看| 国产午夜福利精品一区二区三区 | 久久亚洲国产午夜精品理论片 | 久久国产精品偷99| 国产精品一区三区| 国产精品视频色视频| 国产精品国产三级在线专区| 国产成人精品一区在线| 精品人体无码一区二区三区| 久久久久国产精品三级网|