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 相关文章推荐
JQuery 获得绝对,相对位置的坐标方法
Feb 09 Javascript
js异常捕获方法介绍
Apr 10 Javascript
jQuery 复合选择器应用的几个例子
Sep 11 Javascript
js继承call()和apply()方法总结
Dec 08 Javascript
DOM节点深度克隆函数cloneNode()用法实例
Jan 12 Javascript
基于Css3和JQuery实现打字机效果
Aug 11 Javascript
分享两段简单的JS代码防止SQL注入
Apr 12 Javascript
jquery easyui datagrid实现增加,修改,删除方法总结
May 25 Javascript
通过构造函数实例化对象的方法
Jun 28 Javascript
Vue + element 实现多选框组并保存已选id集合的示例代码
Jun 03 Javascript
vue实现多个echarts根据屏幕大小变化而变化实例
Jul 19 Javascript
Canvas三种动态画圆实现方法说明(小结)
Apr 16 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 HTML JavaScript MySQL代码如何互相传值的方法分享
2012/09/30 PHP
php将mysql数据库整库导出生成sql文件的具体实现
2014/01/08 PHP
php删除文本文件中重复行的方法
2015/04/28 PHP
Yii2搭建后台并实现rbac权限控制完整实例教程
2016/04/28 PHP
PHP简单读取PDF页数的实现方法
2016/07/21 PHP
再次分享18个非常棒的jQuery表格插件
2011/04/10 Javascript
网页打开自动最大化的js代码
2012/08/22 Javascript
JavaScript 32位整型无符号操作示例
2013/12/08 Javascript
解决json日期格式问题的3种方法
2014/02/02 Javascript
JS实现仿百度输入框自动匹配功能的示例代码
2014/02/19 Javascript
与Math.pow 相反的函数使用介绍
2014/08/04 Javascript
jQuery制作可自定义大小的拼图游戏
2015/03/30 Javascript
jquery插件tytabs.jquery.min.js实现渐变TAB选项卡效果
2015/08/25 Javascript
JS实现的表格操作类详解(添加,删除,排序,上移,下移)
2015/12/22 Javascript
Bootstrap组件(一)之菜单
2016/05/11 Javascript
Vue组件BootPage实现简单的分页功能
2016/09/12 Javascript
Javascript Function.prototype.bind详细分析
2016/12/29 Javascript
Vue-cli4 配置 element-ui 按需引入操作
2020/09/11 Javascript
vue 解决IOS10低版本白屏的问题
2020/11/17 Javascript
[02:13] 完美世界DOTA2联赛PWL DAY5集锦
2020/11/03 DOTA
解决python3 urllib中urlopen报错的问题
2017/03/25 Python
Tensorflow实现AlexNet卷积神经网络及运算时间评测
2018/05/24 Python
pyttsx3实现中文文字转语音的方法
2018/12/24 Python
python 变量初始化空列表的例子
2019/11/28 Python
Pycharm制作搞怪弹窗的实现代码
2021/02/19 Python
匡威比利时官网:Converse Belgium
2017/04/13 全球购物
西班牙国家航空官方网站:Iberia
2017/11/16 全球购物
CHARLES & KEITH台湾官网:新加坡时尚品牌
2019/07/30 全球购物
如何安装ruby on rails
2014/02/09 面试题
倡议书格式范文
2014/04/14 职场文书
纪念九一八事变演讲稿:勿忘国耻
2014/09/14 职场文书
2014最新股权信托合同协议书
2014/11/18 职场文书
学生个人总结范文
2015/02/15 职场文书
2015年度质量工作总结报告
2015/04/27 职场文书
祝福语集锦:给妹妹结婚的祝福语
2019/12/18 职场文书
Golang 使用Map实现去重与set的功能操作
2021/04/29 Golang