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入门学习资料收集整理篇
Jul 06 Javascript
深入理解JavaScript 闭包究竟是什么
Apr 12 Javascript
页面按钮禁用与解除禁用的方法
Feb 19 Javascript
php中给js数组赋值方法
Mar 10 Javascript
js时间查询插件使用详解
Apr 07 Javascript
AngularJS路由Ui-router模块用法示例
May 29 Javascript
[js高手之路]从原型链开始图解继承到组合继承的产生详解
Aug 28 Javascript
jQueryUI Sortable 应用Demo(分享)
Sep 07 jQuery
微信小程序自动客服功能
Nov 02 Javascript
读懂CommonJS的模块加载
Apr 19 Javascript
Vue组件通信的几种实现方法
Apr 25 Javascript
微信小程序 checkbox使用实例解析
Sep 09 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网页游戏学习之Xnova(ogame)源码解读(三)
2014/06/23 PHP
php实现常见图片格式的水印和缩略图制作(面向对象)
2016/06/15 PHP
php格式文件打开的四种方法
2018/02/24 PHP
php使用goto实现自动重启swoole、reactphp、workerman服务的代码
2020/04/13 PHP
VBScript版代码高亮
2006/06/26 Javascript
拖动Html元素集合 Drag and Drop any item
2006/12/22 Javascript
Ajax执行顺序流程及回调问题分析
2012/12/10 Javascript
jQuery打印指定区域Html页面并自动分页
2014/07/04 Javascript
js闭包实例汇总
2014/11/09 Javascript
Jquery实现地铁线路指示灯提示牌效果的方法
2015/03/02 Javascript
javascript实现全角半角检测的方法
2015/07/23 Javascript
基于JS实现回到页面顶部的五种写法(从实现到增强)
2016/09/03 Javascript
使用BootStrap和Metroui设计的metro风格微网站或手机app界面
2016/10/21 Javascript
Jquery循环截取字符串的方法(多出的字符串处理成"...")
2016/11/28 Javascript
JS实现图片垂直居中显示小结
2016/12/13 Javascript
JS作用域深度解析
2016/12/29 Javascript
简单的vue-resourse获取json并应用到模板示例
2017/02/10 Javascript
select自定义小三角样式代码(实用总结)
2017/08/18 Javascript
JS实现的图片选择顺序切换和循环切换功能示例【测试可用】
2018/12/28 Javascript
微信小程序云开发之新手环境配置
2019/05/16 Javascript
jquery实现垂直无限轮播的方法分析
2019/07/16 jQuery
使用webpack/gulp构建TypeScript项目的方法示例
2019/12/18 Javascript
详解vue3.0 的 Composition API 的一种使用方法
2020/10/26 Javascript
nodeJs项目在阿里云的简单部署
2020/11/27 NodeJs
[03:48]显微镜下的DOTA2第四期——TP动作
2014/06/20 DOTA
python将文本中的空格替换为换行的方法
2018/03/19 Python
python 通过麦克风录音 生成wav文件的方法
2019/01/09 Python
Python面向对象程序设计之继承、多态原理与用法详解
2020/03/23 Python
python Zmail模块简介与使用示例
2020/12/19 Python
sealed修饰符是干什么的
2012/10/23 面试题
函授自我鉴定范文
2014/02/06 职场文书
2014县政府领导班子三严三实对照检查材料思想汇报
2014/09/26 职场文书
2014卖家双十一活动策划书
2014/09/29 职场文书
考研导师推荐信范文
2015/03/27 职场文书
《中彩那天》教学反思
2016/02/24 职场文书
创业计划书之外语培训班
2019/11/02 职场文书