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 相关文章推荐
比较全的JS checkbox全选、取消全选、删除功能代码
Dec 19 Javascript
JAVASCRIPT函数作用域和提前声明 分享
Aug 22 Javascript
js格式化货币数据实现代码
Sep 04 Javascript
javascript陷阱 一不小心你就中招了(字符运算)
Nov 10 Javascript
jQuery的text()方法用法分析
Dec 20 Javascript
jquery实现简单实用的弹出层效果代码
Oct 15 Javascript
js实现增加数字显示的环形进度条效果
Feb 05 Javascript
原生JS控制多个滚动条同步跟随滚动效果
Dec 22 Javascript
angular4中*ngFor不能对返回来的对象进行循环的解决方法
Sep 12 Javascript
JavaScript中AOP的实现与应用
May 06 Javascript
JQuery 实现文件下载的常用方法分析
Oct 29 jQuery
小程序自定义导航栏兼容适配所有机型(附完整案例)
Apr 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 函数语法介绍一
2009/06/14 PHP
php中将数组存到文件里的实现代码
2012/01/19 PHP
PHP中常用的转义函数
2014/02/28 PHP
php读取csv数据保存到数组的方法
2015/01/03 PHP
PHP面向对象程序设计类的定义与用法简单示例
2016/12/27 PHP
JavaScript OOP类与继承
2009/11/15 Javascript
优化javascript的执行速度
2010/01/23 Javascript
JavaScript中通过闭包解决只能取得包含函数中任何变量最后一个值的问题
2010/08/12 Javascript
javascript基础知识大集锦(一) 推荐收藏
2011/01/13 Javascript
js实现图片放大缩小功能后进行复杂排序的方法
2012/11/08 Javascript
scrollWidth,clientWidth,offsetWidth的区别
2015/01/13 Javascript
jQuery给元素添加样式的方法详解
2015/12/30 Javascript
JavaScript+html5 canvas绘制缤纷多彩的三角形效果完整实例
2016/01/26 Javascript
vue mintui-Loadmore结合实现下拉刷新和上拉加载示例
2017/10/12 Javascript
bootstrap模态框弹出和隐藏,动态改变中间内容的实例
2018/08/10 Javascript
原生JS实现获取及修改CSS样式的方法
2018/09/04 Javascript
[01:21:07]EG vs Liquid 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
python统计文本文件内单词数量的方法
2015/05/30 Python
int在python中的含义以及用法
2019/06/27 Python
Tensorflow训练模型越来越慢的2种解决方案
2020/02/07 Python
Django使用Celery加redis执行异步任务的实例内容
2020/02/20 Python
如何使用Python处理HDF格式数据及可视化问题
2020/06/24 Python
如何解决pycharm调试报错的问题
2020/08/06 Python
Python使用paramiko连接远程服务器执行Shell命令的实现
2021/03/04 Python
h5调用摄像头的实现方法
2016/06/01 HTML / CSS
中国医药集团国药在线:国药网
2017/02/06 全球购物
凯撒娱乐:Caesars Entertainment
2018/02/23 全球购物
Omio俄罗斯:一次搜索公共汽车、火车和飞机的机票
2018/11/17 全球购物
如何写一份好的自荐信
2014/01/02 职场文书
个性发展自我评价
2014/02/11 职场文书
机工车间主任岗位职责
2014/03/05 职场文书
超市客服工作职责
2014/06/11 职场文书
无罪辩护词范文
2015/05/21 职场文书
机关工会工作总结2015
2015/05/26 职场文书
MongoDB支持的数据类型
2022/04/11 MongoDB
Python Matplotlib绘制等高线图与渐变色扇形图
2022/04/14 Python