我是靠谱客的博主 美丽橘子,最近开发中收集的这篇文章主要介绍Node.js中什么是非阻塞I/O?通过示例来理解!,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

  • I/O就是input/output,一个系统的输入输出
  • 阻塞I/O和非阻塞I/O的区别就在于系统的接收输入,在到输出期间,能不能接收其他输入

举个栗子

  • 去食堂吃饭:我们都要排队打饭

    我们的流程是:排队------>等前面的人打饭-------->轮到我们自己打饭------->开始吃饭

  • 出去吃饭:餐厅点菜

    现在我们的流程是:坐下------->点菜------->等待-------->开始吃饭

  • 排队打饭 vs 餐厅点菜

  • 对于点菜人员的我们来说:

    • 排队打饭是阻塞I/O
    • 餐厅点菜是非阻塞I/O

继续来看最上面那句话:

在栗子中,系统=食堂打饭的阿姨或者是餐厅服务生,输入=点菜,输出=端菜(上菜)

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

服务生点完菜之后还可以服务其他客人------->非阻塞I/O

其实,这个问题小学老师就教过我们

没想到吧?(其实我也没想到~)

在这个过程中,我们用洗衣机洗衣服=输入,晾衣服=输出,在洗衣机洗衣服的过程中,我们是可以去做其他事情的,所以这个属于非阻塞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直接运行这个文件

1.png

看第一行,在我的电脑上执行共花费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',并在计时完成后进行一个打印语句的操作,让我们来看看结果:

2.png

首先还是我们的时间:3.258ms,跟之前的20.93比起来,简直少了不要太多好嘛,完后是我们输出的语句,最后才打印了我们想要的操作结果,也就是说,它在输入输出之间进行了别的操作,对结果无影响,且用时少了好多!

结论

我的理解:非阻塞I/O让我们减少了许多等待的时间,并且在等待时间内,我们还可以进行一些其他的操作(欢迎大佬给予指点!!!!)

最后

以上就是美丽橘子为你收集整理的Node.js中什么是非阻塞I/O?通过示例来理解!的全部内容,希望文章能够帮你解决Node.js中什么是非阻塞I/O?通过示例来理解!所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(82)

评论列表共有 0 条评论

立即
投稿
返回
顶部