Node.JS中事件轮询(Event Loop)的解析


Posted in Javascript onFebruary 25, 2017

当我们知道I/O操作和创建新线程的开销是巨大的!

网站延迟的开销

对于一个网站,后台大多不需要进行复杂的计算,我们的程序大多时间花费在I/O读取上。

看到一个数据:IO操作可以比数据处理慢几个数量级。高端SSD固态硬盘的读取速度可以达到200mb-700mb/s;读取1000字节需要1.4微秒。而在此期间,2GHZ频率的CPU可以执行28000个指令处理周期。而网络数据的IO甚至更慢!

Node.JS中事件轮询(Event Loop)的解析

NodeJS采用单线程非阻塞的架构解决老大难的IO问题

当采用多线程时,为每一个请求开启一个新的线程(Apache就是这样做的)。当并发增多,线程的消耗会十分严重。

什么是阻塞和非阻塞呢?

阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。

var fs = require("fs");
fs.readFile("./testfile", "utf8", function(error, file) { 
  if (error) throw error; 
  console.log("我读完文件了!");
});
console.log("我不会被阻塞!");

用node执行以下代码,会先输出我不会被阻塞,再输出我读完文件了

一个知乎的回答:

你打电话问书店老板有没有《分布式系统》这本书,你如果是阻塞式调用,你会一直把自己“挂起”,直到得到这本书有没有的结果,如果是非阻塞式调用,你不管老板有没有告诉你,你自己先一边去玩了, 当然你也要偶尔过几分钟check一下老板有没有返回结果。

NodeJS的事件轮询

这是node虽然为单线程,但是可以处理大并发,高吞吐量的核心。一个事件轮询拥有下面三个组件

  1. 事件队列:这是一个FIFO模型的队列,一方推入事件,另一方推出事件
  2. 队列的读取轮询线程组件,也就是主角Event Loop,
  3. 单独的线程池,用来执行长任务(也就是threadpool,node底层,用C++写的,不会阻塞)

Node.JS中事件轮询(Event Loop)的解析

在nodejs中,只有一个主线程(也就是前面说的单线程)来不断读取轮询(书中称为调用I/O观察者)队列中是否有事件。

而对于读取文件,HTTP

请求等(现代cpu处理能力很强,事件处理相当快,导致运行速度下降的瓶颈在I/O)比较容易堵塞的事件,就在这个单线程中

执行肯定会造成堵塞,所以Event Loop

会把这类型的事件交给底层的线程池执行,并给予线程池一个回调函数,当线程池操作

完成这堵塞任务后,便把结果和回调函数一起再放入轮询队列中。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
JS预览图像将本地图片显示到浏览器上
Aug 25 Javascript
javascript去除字符串中所有标点符号和提取纯文本的正则
Jun 07 Javascript
jquery实现通用版鼠标经过淡入淡出效果
Jun 15 Javascript
jquery html动态添加的元素绑定事件详解
May 24 Javascript
JS ES6多行字符串与连接字符串的表示方法
Apr 26 Javascript
Vue.js实现网格列表布局转换方法
Aug 25 Javascript
在NPM发布自己造的轮子的方法步骤
Mar 09 Javascript
跟混乱的页面弹窗说再见
Apr 11 Javascript
jQuery实现input输入框获取焦点与失去焦点时提示的消失与显示功能示例
May 27 jQuery
在vue和element-ui的table中实现分页复选功能
Dec 04 Javascript
js验证账户名是否重复
May 26 Javascript
JavaScript异步操作中串行和并行
Nov 20 Javascript
走进javascript——不起眼的基础,值和分号
Feb 24 #Javascript
angular.js 路由及页面传参示例
Feb 24 #Javascript
实例解析js中try、catch、finally的执行规则
Feb 24 #Javascript
js中开关变量使用实例
Feb 24 #Javascript
angularjs点击图片放大实现上传图片预览
Feb 24 #Javascript
js实现导航吸顶效果
Feb 24 #Javascript
canvas绘制多边形
Feb 24 #Javascript
You might like
php自动给文章加关键词链接的函数代码
2012/11/29 PHP
解析php取整的几种方式
2013/06/25 PHP
phpmailer中文乱码问题的解决方法
2014/04/22 PHP
thinkphp5框架结合mysql实现微信登录和自定义分享链接与图文功能示例
2019/08/13 PHP
在Laravel 中实现是否关注的示例
2019/10/22 PHP
Code:findPosX 和 findPosY
2006/12/20 Javascript
jQuery Lightbox 图片展示插件使用说明
2010/04/25 Javascript
Javascript 面向对象(二)封装代码
2012/05/23 Javascript
JS中FRAME的操作问题实例分析
2014/10/21 Javascript
jQuery 遍历函数详解
2015/07/05 Javascript
倾力总结40条常见的移动端Web页面问题解决方案
2016/05/24 Javascript
jQuery解决IE6、7、8不能使用 JSON.stringify 函数的问题
2016/05/31 Javascript
AngularJS动态绑定ng-options的ng-model实例代码
2017/06/21 Javascript
vue组件挂载到全局方法的示例代码
2018/08/02 Javascript
Python多线程同步Lock、RLock、Semaphore、Event实例
2014/11/21 Python
python使用arp欺骗伪造网关的方法
2015/04/24 Python
python中pandas.DataFrame排除特定行方法示例
2017/03/12 Python
使用python将时间转换为指定的格式方法
2018/11/12 Python
Python第三方Window模块文件的几种安装方法
2018/11/22 Python
python的常用模块之collections模块详解
2018/12/06 Python
TensorFlow实现简单的CNN的方法
2019/07/18 Python
pycharm创建scrapy项目教程及遇到的坑解析
2019/08/15 Python
Python 读取WAV音频文件 画频谱的实例
2020/03/14 Python
Python decorator拦截器代码实例解析
2020/04/04 Python
Python基于正则表达式实现计算器功能
2020/07/13 Python
美国在线健康和美容市场:Pharmapacks
2018/12/05 全球购物
Madda Fella官网:美国冒险家服装品牌
2020/01/16 全球购物
商务英语专业自荐信
2013/10/14 职场文书
办公室驾驶员岗位职责
2013/11/15 职场文书
企划经理的岗位职责
2013/11/17 职场文书
大型活动策划方案
2014/01/12 职场文书
保健品市场营销方案
2014/03/31 职场文书
企业承诺书格式范文
2015/04/28 职场文书
学校运动会通讯稿
2015/07/18 职场文书
防溺水主题班会教案
2015/08/12 职场文书
2016年保险公众宣传日活动总结
2016/04/05 职场文书