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 相关文章推荐
Ubuntu 11.10 安装Node.js的方法
Nov 30 Javascript
点击按钮自动加关注的代码(sina微博/QQ空间/人人网/腾讯微博)
Jan 02 Javascript
如何编写高质量JS代码
Dec 28 Javascript
js实现从数组里随机获取元素
Jan 12 Javascript
嵌入式iframe子页面与父页面js通信的方法
Jan 20 Javascript
微信小程序中单位rpx和rem的使用
Dec 06 Javascript
jquery pagination插件动态分页实例(Bootstrap分页)
Dec 23 Javascript
AngularJS路由切换实现方法分析
Mar 17 Javascript
node通过npm写一个cli命令行工具
Oct 12 Javascript
Vue动态控制input的disabled属性的方法
Jun 26 Javascript
小程序rich-text组件如何改变内部img图片样式的方法
May 22 Javascript
vue 自动化路由实现代码
Sep 03 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
Home Coffee Roasting
2021/03/03 咖啡文化
PHP中计算字符串相似度的函数代码
2012/12/29 PHP
php 读取文件头判断文件类型的实现代码
2013/08/05 PHP
javascript的onchange事件与jQuery的change()方法比较
2009/09/28 Javascript
一款Jquery 分页插件的改造方法(服务器端分页)
2011/07/11 Javascript
Javascript 中 null、NaN和undefined的区别总结
2013/04/10 Javascript
ajax与302响应代码测试
2013/10/23 Javascript
javascript使用百度地图api和html5特性获取浏览器位置
2014/01/10 Javascript
js实现当复选框选择匿名登录时隐藏登录框效果
2015/08/14 Javascript
js+CSS实现模拟华丽的select控件下拉菜单效果
2015/09/01 Javascript
javascript实现获取浏览器版本、浏览器类型
2015/12/02 Javascript
KnockoutJS 3.X API 第四章之数据控制流foreach绑定
2016/10/10 Javascript
Angularjs中数据绑定的实例详解
2017/08/25 Javascript
浅析vue.js数组的变异方法
2018/06/30 Javascript
JavaScript和TypeScript中的void的具体使用
2019/09/12 Javascript
Python 时间处理datetime实例
2008/09/06 Python
python基础知识小结之集合
2015/11/25 Python
python编程实现随机生成多个椭圆实例代码
2018/01/03 Python
jupyter notebook 调用环境中的Keras或者pytorch教程
2020/04/14 Python
浅谈python3打包与拆包在函数的应用详解
2020/05/02 Python
13个Pandas实用技巧,助你提高开发效率
2020/08/19 Python
最新版 Windows10上安装Python 3.8.5的步骤详解
2020/11/28 Python
Django扫码抽奖平台的配置过程详解
2021/01/14 Python
大学生个人推荐信范文
2013/11/25 职场文书
计算机求职信
2013/12/01 职场文书
职业规划书如何设计?
2014/01/09 职场文书
母亲节演讲稿
2014/05/27 职场文书
个人年终总结结尾
2015/03/06 职场文书
商业计划书格式、范文
2019/03/21 职场文书
创业计划书之奶茶店开店方案范本!
2019/08/06 职场文书
2019脱贫攻坚工作总结报告范本!
2019/08/06 职场文书
Python数据可视化之绘制柱状图和条形图
2021/05/25 Python
MySQL 亿级数据导入导出及迁移笔记
2021/06/18 MySQL
解决Mysql的left join无效及使用的注意事项说明
2021/07/01 MySQL
CSS实现九宫格布局(自适应)的示例代码
2022/02/12 HTML / CSS
浅谈redis的过期时间设置和过期删除机制
2022/03/18 MySQL