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模拟push
Mar 06 Javascript
js中数组结合字符串实现查找(屏蔽广告判断url等)
Mar 30 Javascript
jQuery实现div横向拖拽排序的简单实例
Jul 13 Javascript
用自定义图片代替原生checkbox实现全选,删除以及提交的方法
Oct 18 Javascript
基于jQuery实现滚动切换效果
Dec 02 Javascript
微信小程序中的swiper组件详解
Apr 14 Javascript
JavaScript实现元素滚动条到达一定位置循环追加内容
Dec 28 Javascript
Vue 页面切换效果之 BubbleTransition(推荐)
Apr 08 Javascript
vue中的模态对话框组件实现过程
May 01 Javascript
iview Upload组件多个文件上传的示例代码
Sep 30 Javascript
浅谈React Native 传参的几种方式(小结)
May 21 Javascript
微信小程序:报错(in promise) MiniProgramError
Oct 30 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
咖啡风味 世界咖啡主要分布分布 咖啡的生长要求
2021/03/06 新手入门
php过滤危险html代码
2008/08/18 PHP
php SQL之where语句生成器
2009/03/24 PHP
php中大括号作用介绍
2012/03/22 PHP
php中3种方法统计字符串中每种字符的个数并排序
2012/08/27 PHP
完整删除ecshop中获取店铺信息的API
2014/12/24 PHP
php图形jpgraph操作实例分析
2017/02/22 PHP
PHP数组遍历的几种常见方式总结
2019/02/15 PHP
Jsonp 跨域的原理以及Jquery的解决方案
2011/06/27 Javascript
什么是json和jsonp,jQuery json实例详详细说明
2012/12/11 Javascript
Dom 学习总结以及实例的使用介绍
2013/04/24 Javascript
jquery索引在使用中的一些困惑
2013/10/24 Javascript
javascript 判断整数方法分享
2014/12/16 Javascript
JavaScript结合AJAX_stream实现流式显示
2015/01/08 Javascript
jquery使用正则表达式验证email地址的方法
2015/01/22 Javascript
JavaScript把数组作为堆栈使用的方法
2015/03/20 Javascript
jquery代码实现多选、不同分享功能
2015/07/31 Javascript
JS+CSS实现分类动态选择及移动功能效果代码
2015/10/19 Javascript
js识别uc浏览器的代码
2015/11/06 Javascript
javascript函数中的3个高级技巧
2016/09/22 Javascript
Vue-Router基础学习笔记(小结)
2018/10/15 Javascript
JavaScript的级联函数用法简单示例【链式调用】
2019/03/26 Javascript
了解javascript中变量及函数的提升
2019/05/27 Javascript
Python 安装setuptools和pip工具操作方法(必看)
2017/05/22 Python
PyQt5每天必学之创建窗口居中效果
2018/04/19 Python
Python常见的pandas用法demo示例
2019/03/16 Python
numpy ndarray 按条件筛选数组,关联筛选的例子
2019/11/26 Python
Python读取配置文件(config.ini)以及写入配置文件
2020/04/08 Python
Python正则表达式如何匹配中文
2020/05/27 Python
Python模拟伯努利试验和二项分布代码实例
2020/05/27 Python
如何让PyQt5中QWebEngineView与JavaScript交互
2020/10/21 Python
AVON雅芳官网:世界上最大的美容化妆品公司之一
2016/11/02 全球购物
惊艳的手工时装首饰:Migonne Gavigan
2018/02/23 全球购物
高中毕业自我鉴定
2013/12/13 职场文书
汽车技术服务与贸易专业求职信
2014/07/20 职场文书
智慧人生:永远不需要向任何人解释你自己
2019/08/20 职场文书