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 相关文章推荐
JavaScript的变量作用域深入理解
Oct 25 Javascript
jQuery在iframe中无法弹出对话框的解决方法
Jan 12 Javascript
javascript表格隔行变色加鼠标移入移出及点击效果的方法
Apr 10 Javascript
在JavaScript中处理时间之getHours()方法的使用
Jun 10 Javascript
js实现当鼠标移到表格上时显示这一格全部内容的代码
Jun 12 Javascript
JS图片预加载插件详解
Jun 21 Javascript
jq.ajax+php+mysql实现关键字模糊查询(示例讲解)
Jan 02 Javascript
jQuery使用动画队列自定义动画操作示例
Jun 16 jQuery
微信小程序Page中data数据操作和函数调用方法
May 08 Javascript
vue 页面回退mounted函数不执行的解决方案
Jul 26 Javascript
vue3.0 加载json的方法(非ajax)
Oct 26 Javascript
Vue实现boradcast和dispatch的示例
Nov 13 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
如何使用GDB调试PHP程序
2015/12/08 PHP
PHP获取真实客户端的真实IP
2017/03/07 PHP
使用composer安装使用thinkphp6.0框架问题【视频教程】
2019/10/01 PHP
javascript DOM编程实例(智播客学习)
2009/11/23 Javascript
JavaScript中的变量定义与储存介绍
2014/12/31 Javascript
JS实现灵巧的下拉导航效果代码
2015/08/25 Javascript
关于JS中prototype的理解
2015/09/07 Javascript
浅析js绑定事件的常用方法
2016/05/15 Javascript
Json解析的方法小结
2016/06/22 Javascript
微信小程序 Audio API详解及实例代码
2016/09/30 Javascript
jQuery插件HighCharts绘制简单2D折线图效果示例【附demo源码】
2017/03/21 jQuery
vue.js的手脚架vue-cli项目搭建的步骤
2017/08/30 Javascript
node通过npm写一个cli命令行工具
2017/10/12 Javascript
浅谈Vue内置component组件的应用场景
2018/03/27 Javascript
详解关于JSON.parse()和JSON.stringify()的性能小测试
2019/03/14 Javascript
一文读懂ES7中的javascript修饰器
2019/05/06 Javascript
AI小程序之语音听写来了,十分钟掌握百度大脑语音听写全攻略
2020/03/13 Javascript
小程序分享链接onShareAppMessage的具体用法
2020/05/22 Javascript
js实现磁性吸附的示例
2020/10/26 Javascript
jQuery实现简单轮播图效果
2020/12/27 jQuery
python下os模块强大的重命名方法renames详解
2017/03/07 Python
python利用lxml读写xml格式的文件
2017/08/10 Python
python使用tornado实现登录和登出
2018/07/28 Python
Python线程池模块ThreadPoolExecutor用法分析
2018/12/28 Python
Python3.5集合及其常见运算实例详解
2019/05/01 Python
Django 中自定义 Admin 样式与功能的实现方法
2019/07/04 Python
python如何删除文件中重复的字段
2019/07/16 Python
python中把元组转换为namedtuple方法
2020/12/09 Python
详解canvas多边形(蜘蛛图)的画法示例
2018/01/29 HTML / CSS
三星美国官网:Samsung美国
2017/02/06 全球购物
澳洲女装时尚在线:Blue Bungalow
2018/05/05 全球购物
护士实习鉴定范文
2013/12/22 职场文书
数控个人求职信范文
2014/02/03 职场文书
小学节能减排倡议书
2014/05/15 职场文书
建筑工地文明标语
2014/10/09 职场文书
Python OpenCV实现传统图片格式与base64转换
2021/06/13 Python