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 日历提醒系统( 兼容所有浏览器 )
Apr 07 Javascript
JS 非图片动态loading效果实现代码
Apr 09 Javascript
date.parse在IE和FF中的区别
Jul 29 Javascript
JavaScript面向对象(极简主义法minimalist approach)
Jul 17 Javascript
jQuery 设置 CSS 属性示例介绍
Jan 16 Javascript
js 数值转换为3位逗号分隔的示例代码
Feb 19 Javascript
JS小游戏之仙剑翻牌源码详解
Sep 25 Javascript
DOM基础教程之使用DOM控制表格
Jan 20 Javascript
深入理解JavaScript系列(44):设计模式之桥接模式详解
Mar 04 Javascript
Bootstrap基本样式学习笔记之表格(2)
Dec 07 Javascript
vue2.0 常用的 UI 库实例讲解
Dec 12 Javascript
js实现翻牌小游戏
Jul 31 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下封装较好的数字分页方法
2010/11/23 PHP
Drupal读取Excel并导入数据库实例
2014/03/02 PHP
SAE实时日志接口SDK用法示例
2016/10/09 PHP
前端开发的开始---基于面向对象的Ajax类
2010/09/17 Javascript
ASP中Sub和Function的区别说明
2020/08/30 Javascript
JS短路原理的应用示例 精简代码的途径
2013/12/13 Javascript
jquery简单实现图片切换效果的方法
2015/05/12 Javascript
JavaScript操作HTML DOM节点的基础教程
2016/03/11 Javascript
AngularJs  Understanding Angular Templates
2016/09/02 Javascript
Vue DevTools调试工具的使用
2017/12/05 Javascript
vue-cli配置文件——config篇
2018/01/04 Javascript
vue filters的使用详解
2018/06/11 Javascript
JS用最简单的方法实现四舍五入
2019/08/27 Javascript
vue 使用 vue-pdf 实现pdf在线预览的示例代码
2020/04/26 Javascript
Python 实现随机数详解及实例代码
2017/04/15 Python
机器学习经典算法-logistic回归代码详解
2017/12/22 Python
Django框架的中的setting.py文件说明详解
2018/10/15 Python
Python数据结构之栈、队列及二叉树定义与用法浅析
2018/12/27 Python
python列表每个元素同增同减和列表元素去空格的实例
2019/07/20 Python
使用tqdm显示Python代码执行进度功能
2019/12/08 Python
python十进制转二进制的详解
2020/02/07 Python
详解python命令提示符窗口下如何运行python脚本
2020/09/11 Python
python 还原梯度下降算法实现一维线性回归
2020/10/22 Python
python如何实现递归转非递归
2021/02/25 Python
中国旅游网站:同程旅游
2016/09/11 全球购物
空字符串(“”)和null的区别
2012/11/13 面试题
在校生党员自我评价
2013/09/25 职场文书
初三政治教学反思
2014/01/30 职场文书
出国签证在职证明
2014/09/20 职场文书
学校师德师风自我剖析材料
2014/09/29 职场文书
工程催款通知书
2015/04/17 职场文书
惊涛骇浪观后感
2015/06/05 职场文书
浅谈Python实现opencv之图片色素的数值运算和逻辑运算
2021/06/23 Python
Python面向对象之内置函数相关知识总结
2021/06/24 Python
Python类方法总结讲解
2021/07/26 Python
Python OpenGL基本配置方式
2022/05/20 Python