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
直接运行这个文件
看第一行,在我的电脑上执行共花费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’,并在计时完成后进行一个打印语句的操作,让我们来看看结果:
首先还是我们的时间:3.258ms,跟之前的20.93比起来,简直少了不要太多好嘛,完后是我们输出的语句,最后才打印了我们想要的操作结果,也就是说,它在输入输出之间进行了别的操作,对结果无影响,且用时少了好多!
结论
我的理解:非阻塞I/O让我们减少了许多等待的时间,并且在等待时间内,我们还可以进行一些其他的操作(欢迎大佬给予指点!!!!)
更多编程相关知识,请访问:编程入门!!
以上就是Node.js中什么是非阻塞I/O?通过示例来理解!的详细内容,更多请关注亿码酷站其它相关文章!
Node.js中什么是非阻塞I/O?通过示例来理解!
—–文章转载自PHP中文网如有侵权请联系ymkuzhan@126.com删除
本文永久链接地址:https://www.ymkuzhan.com/38211.html