Node中对非阻塞I/O、事件循环的知识点总结


Posted in Javascript onJanuary 05, 2020

Node.js的主要特点

单线程、非阻塞I/O、事件驱动,这三个特点是相辅相成的。

Node为了在低硬件服务器条件下高并发,所以减少了内存消耗,选择单线程;

因为只有一个线程,所以必须非阻塞I/O,每件事情都有回调函数;

为了合理调度,Node使用了事件环的机制,采用事件驱动来调度事件。

非阻塞I/O

I/O是输入(input)、输出(output)的简称。

阻塞I/O和非阻塞I/O的区别在于系统在输入与输出的期间,能不能接收输入。

举个例子:餐厅服务员招待客人

阻塞I/O:餐厅有多个服务员(多线程),一个服务员对应一个客人,客人从点菜到点菜结束的期间,服务员都会被闲置不做任何事情,直到这桌客人点完菜,服务员才能招待下一桌客人。

非阻塞I/O:餐厅有一个服务员(单线程),服务员招待一桌客人时,对客人说:“你先看下菜单,好了就叫我”。然后前往下一桌继续招待,等到一桌客人点完菜后,服务员再过去处理,如此反复,效率大大提高。

但也不能证明非阻塞I/O是一定好的,比如服务员中间发生意外,所有的客人都要等这一个服务员,这样就会影响餐厅整体质量(可以理解为服务器奔溃);
阻塞I/O由于有多个服务员,一对一的服务,即使有一个发生意外,也不会影响整体质量,而雇多个服务员也要相应的付出成本。

所以没有最好的选择,只有适合的选择,Node.js本身的应用场景就是I/O操作越多优势越明显,但安全性也会下降。

事件循环

事件循环是 Node.js 处理非阻塞 I/O 操作的机制,也是实现非阻塞I/O的前提基础。

非阻塞I/O在每个事情上都注册有回调函数,当其中的一个事情完成的时候,通知 Node.js 将适合的回调函数添加到轮询队列中等待时机执行。

简单来说就是Node.js会每隔一段时间检查一下队列中的回调函数,看看有没有完成的回调函数,如果有就输出结果。

就像上面非阻塞I/O的例子一样,服务员在服务下一桌客人时,会时刻留意上一桌客人的情况。当客人点完菜会通知服务员说:“我点完菜了”,服务员收到后说:“好的,我知道了”,然后将这桌的号码记到本子上(回调函数添加到轮询队列)。等到上菜时,也会按照本子上记录的顺序为客人上菜

以上知识点比较直白一些,大家如果有任何补充和意见可以联系三水点靠木的小编。

Javascript 相关文章推荐
如何在Mozilla Gecko 用Javascript加载XSL
Jan 09 Javascript
javascript 获取函数形参个数
Jul 31 Javascript
javascript的日期对象、数组对象、二维数组使用说明
Dec 22 Javascript
详谈javascript中DOM的基本属性
Feb 26 Javascript
Bootstrap每天必学之进度条
Nov 30 Javascript
简单实现bootstrap选项卡效果
Feb 08 Javascript
在 Angular中 使用 Lodash 的方法
Feb 11 Javascript
vue树形结构获取键值的方法示例
Jun 21 Javascript
Vue中控制v-for循环次数的实现方法
Sep 26 Javascript
使用Angular Cli如何创建Angular私有库详解
Jan 30 Javascript
详解JavaScript 新语法之Class 的私有属性与私有方法
Apr 23 Javascript
使用React-Router实现前端路由鉴权的示例代码
Jul 26 Javascript
原生js实现文件上传、下载、封装等实例方法
Jan 05 #Javascript
详解jQuery中的prop()使用方法
Jan 05 #jQuery
vue 对axios get pust put delete封装的实例代码
Jan 05 #Javascript
JavaScript修改注册表实例代码
Jan 05 #Javascript
详解JavaScript修改注册表的方法
Jan 05 #Javascript
js判断非127开头的IP地址的实例代码
Jan 05 #Javascript
Vue 解决路由过渡动画抖动问题(实例详解)
Jan 05 #Javascript
You might like
php遍历文件夹和文件列表示例分享
2014/03/11 PHP
php版微信公众号接口实现发红包的方法
2016/10/14 PHP
PHP基于GD2函数库实现验证码功能示例
2019/01/27 PHP
document对象execCommand的command参数介绍
2006/08/01 Javascript
详解JavaScript中的blink()方法的使用
2015/06/08 Javascript
JavaScript小技巧整理
2015/12/30 Javascript
JavaScript的设计模式经典之建造者模式
2016/02/24 Javascript
vue router 跳转后回到顶部的实例
2018/08/31 Javascript
微信小程序时间标签和时间范围的联动效果
2019/02/15 Javascript
微信小程序如何实现五星评价功能
2019/10/15 Javascript
node爬取新型冠状病毒的疫情实时动态
2020/02/06 Javascript
JavaScript cookie原理及使用实例
2020/05/08 Javascript
国内常用的js类库大全(CDN公共库)
2020/06/24 Javascript
vue实现div单选多选功能
2020/07/16 Javascript
用python实现对比两张图片的不同
2018/02/05 Python
python生成以及打开json、csv和txt文件的实例
2018/11/16 Python
解决pycharm运行程序出现卡住scanning files to index索引的问题
2019/06/27 Python
详解如何从TensorFlow的mnist数据集导出手写体数字图片
2019/08/05 Python
Python3实现配置文件差异对比脚本
2019/11/18 Python
python GUI库图形界面开发之PyQt5打印控件QPrinter详细使用方法与实例
2020/02/28 Python
Python selenium页面加载慢超时的解决方案
2020/03/18 Python
python MultipartEncoder传输zip文件实例
2020/04/07 Python
Python通过len函数返回对象长度
2020/10/22 Python
《音乐之都维也纳》教学反思
2014/04/16 职场文书
大学生入党推荐书范文
2014/05/17 职场文书
门店业绩提升方案
2014/06/08 职场文书
产品陈列协议书(标准版)
2014/09/17 职场文书
小学生运动会通讯稿
2014/09/23 职场文书
铅球加油稿100字
2014/09/26 职场文书
大学生上课迟到检讨书
2014/10/15 职场文书
医生见习报告范文
2014/11/03 职场文书
2014年民政工作总结
2014/11/26 职场文书
2014年煤矿安全工作总结
2014/12/04 职场文书
奖学金感谢信
2015/01/21 职场文书
《孙子兵法》:欲成大事者,需读懂这些致胜策略
2019/08/23 职场文书
使用pandas模块实现数据的标准化操作
2021/05/14 Python