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 ajax方式直接提交整个表单核心代码
Aug 15 Javascript
js校验表单后提交表单的三种方法总结
Feb 28 Javascript
node.js超时timeout详解
Nov 26 Javascript
javascript实现倒计时并弹窗提示特效
Jun 05 Javascript
javascript正则表达式定义(语法)总结
Jan 08 Javascript
jquery UI Datepicker时间控件的使用及问题解决
Apr 28 Javascript
jquery+Jscex打造游戏力度条
Sep 12 Javascript
详解MVC如何使用开源分页插件(shenniu.pager.js)
Dec 16 Javascript
基于jQuery实现简单人工智能聊天室
Feb 10 Javascript
详解JS构造函数中this和return
Sep 16 Javascript
vue实现分页加载效果
Dec 24 Javascript
jquery实现上传文件进度条
Mar 26 jQuery
原生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 防止单引号,双引号在接受页面转义
2008/07/10 PHP
深入php var_dump()函数的详解
2013/06/05 PHP
提高PHP性能的编码技巧以及性能优化详细解析
2013/08/24 PHP
基于laravel Request的所有方法详解
2019/09/29 PHP
PHP7 安装event扩展的实现方法
2019/10/08 PHP
JavaScript Event学习第二章 Event浏览器兼容性
2010/02/07 Javascript
一起来写段JS drag拖动代码
2010/12/09 Javascript
Jquery 模板数据绑定插件的使用方法详解
2013/07/08 Javascript
鼠标移入移出事件改变图片的分辨率的两种方法
2013/12/17 Javascript
jquery中ajax函数执行顺序问题之如何设置同步
2014/02/28 Javascript
jQuery的Read()方法代替原生JS详解
2016/11/08 Javascript
Angularjs 动态改变title标题(兼容ios)
2016/12/29 Javascript
javascript简写常用的12个技巧(可以大大减少你的js代码量)
2020/03/28 Javascript
JavaScript复制内容到剪贴板的两种常用方法
2018/02/27 Javascript
mpvue中使用flyjs全局拦截的实现代码
2018/09/13 Javascript
JS canvas绘制五子棋的棋盘
2020/05/28 Javascript
vue中的router-view组件的使用教程
2018/10/23 Javascript
vue实现二级导航栏效果
2019/10/19 Javascript
javascript实现弹幕墙效果
2019/11/28 Javascript
微信小程序 flexbox layout快速实现基本布局的解决方案
2020/03/24 Javascript
python网页请求urllib2模块简单封装代码
2014/02/07 Python
Python简单计算文件MD5值的方法示例
2018/04/11 Python
Django 使用easy_thumbnails压缩上传的图片方法
2019/07/26 Python
python list多级排序知识点总结
2019/10/23 Python
python保存log日志,实现用log日志画图
2019/12/24 Python
加拿大高尔夫超市:Golf Town
2018/01/12 全球购物
德国足球商店:OUTFITTER
2019/05/06 全球购物
澳大利亚窗帘商店:Curtain Wonderland
2019/12/01 全球购物
银行行长竞聘演讲稿
2014/04/23 职场文书
班主任工作经验交流材料
2014/05/13 职场文书
企业员工辞职信范文
2015/05/12 职场文书
预备党员考察意见范文
2015/06/01 职场文书
AI:如何训练机器学习的模型
2021/04/16 Python
Python3 类型标注支持操作
2021/06/02 Python
Nginx四层负载均衡的配置指南
2021/06/11 Servers
Redis中缓存穿透/击穿/雪崩问题和解决方法
2021/12/04 Redis