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 相关文章推荐
滚动经典最新话题[prototype框架]下编写
Oct 03 Javascript
addRule在firefox下的兼容写法
Nov 30 Javascript
JavaScript 学习笔记二 字符串拼接
Mar 28 Javascript
使用coffeescript编写node.js项目的方法汇总
Aug 05 Javascript
jQuery简单获取键盘事件的方法
Jan 22 Javascript
jQuery根据name属性进行查找的用法分析
Jun 23 Javascript
AngularJS内建服务$location及其功能详解
Jul 01 Javascript
JavaScript DOM节点操作方法总结
Aug 23 Javascript
老生常谈jacascript DOM节点获取
Apr 17 Javascript
解决修复npm安装全局模块权限的问题
May 17 Javascript
Vue常用指令详解分析
Aug 19 Javascript
JavaScript实现飞舞的泡泡效果
Feb 07 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的控制语句
2006/10/09 PHP
简单的php 验证图片生成函数
2009/05/21 PHP
Chrome Web App开发小结
2014/09/04 PHP
js兼容的placeholder属性详解
2013/08/18 Javascript
轻松创建nodejs服务器(6):作出响应
2014/12/18 NodeJs
一个仿微博登陆邮箱提示框js开发案例
2016/07/28 Javascript
AngularJS控制器controller给模型数据赋初始值的方法
2017/01/04 Javascript
JavaScript中为事件指定处理程序的五种方式分析
2018/07/27 Javascript
利用node 判断打开的是文件 还是 文件夹的实例
2019/06/10 Javascript
茶余饭后聊聊Vue3.0响应式数据那些事儿
2019/10/30 Javascript
JavaScript鼠标拖拽事件详解
2020/04/03 Javascript
vue实现图片按比例缩放问题操作
2020/08/11 Javascript
彻底搞懂并解决vue-cli4中图片显示的问题实现
2020/08/31 Javascript
JS实现购物车基本功能
2020/11/08 Javascript
[47:03]Ti4第二日主赛事败者组 LGD vs iG 2
2014/07/21 DOTA
python进阶教程之函数参数的多种传递方法
2014/08/30 Python
Python中的各种装饰器详解
2015/04/11 Python
python实现按任意键继续执行程序
2016/12/30 Python
Python递归函数定义与用法示例
2017/06/02 Python
Django uwsgi Nginx 的生产环境部署详解
2019/02/02 Python
Python3日期与时间戳转换的几种方法详解
2019/06/04 Python
win7下 python3.6 安装opencv 和 opencv-contrib-python解决 cv2.xfeatures2d.SIFT_create() 的问题
2019/10/24 Python
解决pycharm最左侧Tool Buttons显示不全的问题
2019/12/17 Python
django 多数据库及分库实现方式
2020/04/01 Python
Django修改app名称和数据表迁移方案实现
2020/09/17 Python
使用CSS3代码绘制可爱的Hello Kitty猫
2016/08/03 HTML / CSS
计算机专业个人求职信范例
2013/09/23 职场文书
大学生毕业自我评价范文分享
2013/11/11 职场文书
西安交大自主招生自荐信
2014/01/27 职场文书
大学生学习2014全国两会心得体会
2014/03/13 职场文书
初三新学期计划书
2014/05/03 职场文书
跳槽求职信范文
2014/05/26 职场文书
校园新闻广播稿5篇
2014/10/10 职场文书
论文答谢词
2015/01/20 职场文书
教育教学读书笔记
2015/07/02 职场文书
Python利用机器学习算法实现垃圾邮件的识别
2021/06/28 Python