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 相关文章推荐
JavaScript CSS修改学习第六章 拖拽
Feb 19 Javascript
JavaScript eval() 函数介绍及应用示例
Jul 29 Javascript
jQuery使用append在html元素后同时添加多项内容的方法
Mar 26 Javascript
使用AmplifyJS组件配合JavaScript进行编程的指南
Jul 28 Javascript
jQuery实现简洁的导航菜单效果
Nov 23 Javascript
利用Jquery队列实现根据输入数量显示的动画
Sep 01 Javascript
js Canvas实现的日历时钟案例分享
Dec 25 Javascript
angularJS实现动态添加,删除div方法
Feb 27 Javascript
基于 Immutable.js 实现撤销重做功能的实例代码
Mar 01 Javascript
使用vue-cli(vue脚手架)快速搭建项目的方法
May 21 Javascript
jQuery实现获取选中复选框的值实例详解
Jun 28 jQuery
详谈Object.defineProperty 及实现数据双向绑定
Jul 18 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
一个用mysql_odbc和php写的serach数据库程序
2006/10/09 PHP
PHP 柱状图实现代码
2009/12/04 PHP
php的urlencode()URL编码函数浅析
2011/08/09 PHP
腾讯CMEM的PHP扩展编译安装方法
2015/09/25 PHP
php简单压缩css样式示例
2016/09/22 PHP
PHP iconv()函数字符编码转换的问题讲解
2019/03/22 PHP
js采用map取到id集合组并且实现点击一行选中一行
2013/12/16 Javascript
Bootstrap每天必学之进度条
2015/11/30 Javascript
JavaScript实现带播放列表的音乐播放器实例分享
2016/03/07 Javascript
Bootstrap每天必学之弹出框(Popover)插件
2016/04/25 Javascript
Vue.js中数组变动的检测详解
2016/10/12 Javascript
脚本div实现拖放功能(两种)
2017/02/13 Javascript
js仿微信公众平台打标签功能
2017/04/08 Javascript
javascript checkbox/radio onchange不能兼容ie8处理办法
2017/06/13 Javascript
JS继承与闭包及JS实现继承的三种方式
2017/10/15 Javascript
JS实现根据详细地址获取经纬度功能示例
2019/04/16 Javascript
浅谈Node 异步IO和事件循环
2019/05/05 Javascript
微信小程序实现左滑动删除效果
2020/03/30 Javascript
[36:22]VP vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python简单连接MongoDB数据库的方法
2016/03/15 Python
基于python及pytorch中乘法的使用详解
2019/12/27 Python
python机器学习库xgboost的使用
2020/01/20 Python
TensorFlow实现checkpoint文件转换为pb文件
2020/02/10 Python
python列表删除和多重循环退出原理详解
2020/03/26 Python
sublime3之内网安装python插件Anaconda的流程
2020/11/10 Python
澳大利亚窗帘商店:Curtain Wonderland
2019/12/01 全球购物
护士的自我鉴定
2014/02/07 职场文书
乡镇精神文明建设汇报材料
2014/08/15 职场文书
委托书的写法
2014/08/30 职场文书
镇人大副主席民主生活会对照检查材料思想汇报
2014/10/01 职场文书
中秋客户感谢信
2015/01/22 职场文书
2015年教师党员承诺书
2015/04/27 职场文书
奖金申请报告模板
2015/05/15 职场文书
小兵张嘎观后感
2015/06/03 职场文书
教师信息技术学习心得体会
2016/01/21 职场文书
win10频率超出范围怎么办?win10老显示超出工作频率范围的解决方法
2022/07/07 数码科技