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实现找质数代码分享
Mar 24 Javascript
AngularJs  E2E Testing 详解
Sep 02 Javascript
使用BootStrap实现表格隔行变色及hover变色并在需要时出现滚动条
Jan 04 Javascript
详解Node项目部署到云服务器上
Jul 12 Javascript
详解Node.js模板引擎Jade入门
Jan 19 Javascript
node 命令方式启动修改端口的方法
May 12 Javascript
js核心基础之构造函数constructor用法实例分析
May 11 Javascript
Vue 子组件与数据传递问题及注意事项
Jul 11 Javascript
JavaScript canvas绘制折线图
Feb 18 Javascript
手把手带你入门微信小程序新框架Kbone的使用
Feb 25 Javascript
vue.js this.$router.push获取不到params参数问题
Mar 03 Javascript
JS实现手风琴特效
Nov 08 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
多文件上传的例子
2006/10/09 PHP
Gregarius中文日期格式问题解决办法
2008/04/22 PHP
ThinkPHP自动转义存储富文本编辑器内容导致读取出错的解决方法
2014/08/08 PHP
IE无法设置短域名下Cookie
2010/09/23 Javascript
非主流的textarea自增长实现js代码
2011/12/20 Javascript
js防止表单重复提交实现代码
2012/09/05 Javascript
jQuery产品间断向下滚动效果核心代码
2014/05/08 Javascript
wangEditor编辑器失去焦点后仍然可以在原位置插入图片分析
2015/05/06 Javascript
javaScript实现可缩放的显示区效果代码
2015/10/26 Javascript
js 上传文件预览的简单实例
2016/08/16 Javascript
使用json来定义函数,在里面可以定义多个函数的实现方法
2016/10/28 Javascript
JavaScript闭包和范围实例详解
2016/12/19 Javascript
js 将input框中的输入自动转化成半角大写(税号输入框)
2017/02/16 Javascript
使用JavaScriptCore实现OC和JS交互详解
2017/03/28 Javascript
js字符限制(字符截取) 一个中文汉字算两个字符
2017/09/12 Javascript
vue路由跳转传递参数的方式总结
2020/05/10 Javascript
[01:04:39]OG vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
跟老齐学Python之集合(set)
2014/09/24 Python
python pandas消除空值和空格以及 Nan数据替换方法
2018/10/30 Python
python 如何去除字符串头尾的多余符号
2019/11/19 Python
python中wx模块的具体使用方法
2020/05/15 Python
Python 如何展开嵌套的序列
2020/08/01 Python
HTML5的hidden属性兼容老浏览器的方法
2014/04/23 HTML / CSS
AE美国鹰日本官方网站: American Eagle Outfitters
2016/12/10 全球购物
西班牙用户之间买卖视频游戏的平台:Wakkap
2020/03/21 全球购物
实体的生命周期
2013/08/31 面试题
在校生自我鉴定
2014/01/23 职场文书
师德师风个人反思
2014/04/28 职场文书
校运会口号
2014/06/18 职场文书
关于十八大的演讲稿
2014/09/15 职场文书
出国签证在职证明范本
2014/11/24 职场文书
检讨书范文300字
2015/01/28 职场文书
身份证丢失证明
2015/06/19 职场文书
导游词之金鞭溪风景区
2019/09/12 职场文书
nginx限制并发连接请求数的方法
2021/04/01 Servers
Python集合的基础操作
2021/11/01 Python