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小功能(setInterval实现图片效果显示时间)实例代码
Nov 28 Javascript
jQuery实现数秒后自动提交form的方法
Mar 05 Javascript
JS中的数组方法笔记整理
Jul 26 Javascript
vue父子组件的数据传递示例
Mar 07 Javascript
three.js中文文档学习之通过模块导入
Nov 20 Javascript
基于vue.js 2.x的虚拟滚动条的示例代码
Jan 23 Javascript
vue实现多个元素或多个组件之间动画效果
Sep 25 Javascript
Node.js 使用axios读写influxDB的方法示例
Oct 26 Javascript
解决Vue开发中对话框被遮罩层挡住的问题
Nov 26 Javascript
react写一个select组件的实现代码
Apr 03 Javascript
JavaScript 接口原理与用法实例详解
May 12 Javascript
微信小程序实现选项卡滑动切换
Oct 22 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
150kHz到30Mhz完全冲浪手册
2020/03/20 无线电
浅析PHP水印技术
2007/02/14 PHP
php简单静态页生成过程
2008/03/27 PHP
php minixml详解
2008/07/19 PHP
Javascript与PHP验证用户输入URL地址是否正确
2014/10/09 PHP
PHP使用mysql_fetch_row查询获得数据行列表的方法
2015/03/18 PHP
php截取指定2个字符之间字符串的方法
2015/04/15 PHP
分享一个漂亮的php验证码类
2016/09/29 PHP
Js组件的一些写法
2010/09/10 Javascript
理解Javascript_09_Function与Object
2010/10/16 Javascript
Query中click(),bind(),live(),delegate()的区别
2013/11/19 Javascript
Jquery实现自定义tooltip示例代码
2014/02/12 Javascript
简介AngularJS的HTML DOM支持情况
2015/06/17 Javascript
js计算文本框输入的字符数
2015/10/23 Javascript
修复jQuery tablesorter无法正确排序的bug(加千分位数字后)
2016/03/30 Javascript
JS实现table表格数据排序功能(可支持动态数据+分页效果)
2016/05/26 Javascript
JS Ajax请求如何防止重复提交
2016/06/13 Javascript
JSON键值对序列化和反序列化解析
2017/01/24 Javascript
非常实用的vue导航钩子
2017/03/20 Javascript
jQuery EasyUI之验证框validatebox实例详解
2017/04/10 jQuery
微信小程序 循环及嵌套循环的使用总结
2017/09/26 Javascript
JavaScript实现计算圆周率到小数点后100位的方法示例
2018/05/08 Javascript
在Python编程过程中用单元测试法调试代码的介绍
2015/04/02 Python
Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
2019/01/04 Python
pandas实现DataFrame显示最大行列,不省略显示实例
2019/12/26 Python
python统计函数库scipy.stats的用法解析
2020/02/25 Python
Django实现将views.py中的数据传递到前端html页面,并展示
2020/03/16 Python
浅析HTML5的WebSocket与服务器推送事件
2016/02/19 HTML / CSS
傲盾软件面试题
2015/08/17 面试题
关于圣诞节的广播稿
2014/01/26 职场文书
幼儿园母亲节活动方案
2014/03/10 职场文书
西式婚礼主持词
2014/03/13 职场文书
农村产权制度改革实施方案
2014/03/21 职场文书
2014年租房协议书范本
2014/10/30 职场文书
Redis如何实现分布式锁
2021/08/23 Redis
Python学习之迭代器详解
2022/04/01 Python