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与flash交互通信基础教程
Aug 07 Javascript
jQuery技巧总结
Jan 01 Javascript
JS加jquery简单实现标签元素的显示或隐藏
Sep 23 Javascript
鼠标经过tr时,改变tr当前背景颜色
Jan 13 Javascript
详解js中构造流程图的核心技术JsPlumb
Dec 08 Javascript
Bootstrap3 Grid system原理及应用详解
Sep 30 Javascript
Vue2.0 组件传值通讯的示例代码
Aug 01 Javascript
全选复选框JavaScript编写小结(附代码)
Aug 16 Javascript
解决vue的变量在settimeout内部效果失效的问题
Aug 30 Javascript
微信小程序实现判断是分享到群还是个人功能示例
May 03 Javascript
微信小程序点击列表跳转到对应详情页过程解析
Sep 26 Javascript
实现一个简单得数据响应系统
Nov 11 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
PHP4实际应用经验篇(4)
2006/10/09 PHP
安装PHP可能遇到的问题“无法载入mysql扩展” 的解决方法
2007/04/16 PHP
不错的PHP学习之php4与php5之间会穿梭一点点感悟
2007/05/03 PHP
php调用MySQL存储过程的方法集合(推荐)
2013/07/03 PHP
PHP获取时间排除周六、周日的两个方法
2014/06/30 PHP
Laravel实现autoload方法详解
2017/05/07 PHP
jquery easyui的tabs使用时的问题
2010/03/23 Javascript
十个优秀的Ajax/Javascript实例网站收集
2010/03/31 Javascript
Nodejs极简入门教程(二):定时器
2014/10/25 NodeJs
让html页面不缓存js的实现方法
2014/10/31 Javascript
禁止按回车键提交表单的方法
2015/06/11 Javascript
JavaScript数据类型学习笔记
2016/01/25 Javascript
浅谈js函数三种定义方式 & 四种调用方式 & 调用顺序
2017/02/19 Javascript
angularJS开发注意事项
2018/05/26 Javascript
Vue中"This dependency was not found"问题的解决方法
2018/06/19 Javascript
使用imba.io框架得到比 vue 快50倍的性能基准
2019/06/17 Javascript
解决layui追加或者动态修改的表单元素“没效果”的问题
2019/09/18 Javascript
vue中touch和click共存的解决方式
2020/07/28 Javascript
Vue 使用typescript如何优雅的调用swagger API
2020/09/01 Javascript
vue+echarts实现中国地图流动效果(步骤详解)
2021/01/27 Vue.js
Python实现的金山快盘的签到程序
2013/01/17 Python
Python实现SVN的目录周期性备份实例
2015/07/17 Python
Python3 加密(hashlib和hmac)模块的实现
2017/11/23 Python
python3爬取数据至mysql的方法
2018/06/26 Python
python3转换code128条形码的方法
2019/04/17 Python
Nginx+Uwsgi+Django 项目部署到服务器的思路详解
2020/05/08 Python
浅析Python requests 模块
2020/10/09 Python
软件设计的目标是什么
2016/12/04 面试题
运动会闭幕式解说词
2014/02/21 职场文书
生物科学专业毕业生求职信
2014/06/02 职场文书
2014乡镇领导班子四风对照检查材料思想汇报
2014/10/05 职场文书
普通党员群众路线教育实践活动心得体会
2014/11/04 职场文书
2014年后勤管理工作总结
2014/12/01 职场文书
感谢师恩主题班会
2015/08/17 职场文书
Web前端:CSS最强总结 附详细代码
2021/03/31 HTML / CSS
教你如何用python开发一款数字推盘小游戏
2021/04/14 Python