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给图片添加鼠标经过时的边框效果
Nov 12 Javascript
jQuery中wrapInner()方法用法实例
Jan 16 Javascript
JavaScript使用Max函数返回两个数字中较大数的方法
Apr 06 Javascript
jQuery实现单击弹出Div层窗口效果(可关闭可拖动)
Sep 19 Javascript
JavaScript九九乘法口诀表的简单实现
Oct 04 Javascript
JS实现页面进入和返回定位到具体位置
Dec 08 Javascript
jQuery实现的下雪动画效果示例【附源码下载】
Feb 02 jQuery
Vue高版本中一些新特性的使用详解
Sep 25 Javascript
js实现窗口全屏示例详解
Sep 17 Javascript
JS 数组基本用法入门示例解析
Jan 16 Javascript
原生js实现的金山打字小游戏(实例代码详解)
Mar 16 Javascript
uniapp与webview之间的相互传值的实现
Jun 29 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
通过ICQ网关发送手机短信的PHP源程序
2006/10/09 PHP
PHP基于DOM创建xml文档的方法示例
2017/02/08 PHP
PHP实现的简单排列组合算法应用示例
2017/06/20 PHP
js中复制行和删除行的操作实例
2013/06/25 Javascript
JS动态添加与删除select中的Option对象(示例代码)
2013/12/20 Javascript
借助javascript代码判断网页是静态还是伪静态
2014/05/05 Javascript
JavaScript中String.prototype用法实例
2015/05/20 Javascript
基于JavaScript实现div层跟随滚动条滑动
2016/01/12 Javascript
三种带箭头提示框总结实例
2016/06/14 Javascript
探讨AngularJs中ui.route的简单应用
2016/11/16 Javascript
Html5+jQuery+CSS制作相册小记录
2016/12/30 Javascript
Node.js利用js-xlsx处理Excel文件的方法详解
2017/07/05 Javascript
Vue实现带进度条的文件拖动上传功能
2018/02/23 Javascript
Vuejs+vue-router打包+Nginx配置的实例
2018/09/20 Javascript
在vue项目中引入vue-beauty操作方法
2019/02/11 Javascript
vue中监听返回键问题
2019/08/28 Javascript
kafka调试中遇到Connection to node -1 could not be established. Broker may not be available.
2019/09/17 Javascript
vue项目中使用eslint+prettier规范与检查代码的方法
2020/01/16 Javascript
零基础写python爬虫之爬虫框架Scrapy安装配置
2014/11/06 Python
简单介绍Python中的JSON模块
2015/04/08 Python
python 根据pid杀死相应进程的方法
2017/01/16 Python
Python中is与==判断的区别
2017/03/28 Python
sublime text 3配置使用python操作方法
2017/06/11 Python
详解pandas数据合并与重塑(pd.concat篇)
2019/07/09 Python
Python Django的安装配置教程图文详解
2019/07/17 Python
Python的条件锁与事件共享详解
2019/09/12 Python
Python实现元素等待代码实例
2019/11/11 Python
Python 基于jwt实现认证机制流程解析
2020/06/22 Python
python 高阶函数简单介绍
2021/02/19 Python
HTML5 常见面试题之PC端和移动端区别介绍
2018/01/22 HTML / CSS
家长对孩子的感言
2014/03/10 职场文书
葛优非诚勿扰搞笑征婚台词
2014/03/17 职场文书
打造高效课堂实施方案
2014/03/22 职场文书
2014年党员公开承诺书范文
2014/03/28 职场文书
2014年无财产无子女离婚协议书范本
2014/10/09 职场文书
漫改真人电影「萌系男友是燃燃的橘色」公开先导视觉图
2022/03/21 日漫