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 相关文章推荐
该如何加载google-analytics(或其他第三方)的JS
May 13 Javascript
JavaScript Title、alt提示(Tips)实现源码解读
Dec 12 Javascript
Jquery 一次处理多个ajax请求的代码
Sep 02 Javascript
IE6-IE9不支持table.innerHTML的解决方法分享
Sep 14 Javascript
按Enter键触发事件的jquery方法实现代码
Feb 17 Javascript
JavaScript中字符串拼接的基本方法
Jul 07 Javascript
JavaScript 对象深入学习总结(经典)
Sep 29 Javascript
基于javascript编写简单日历
May 02 Javascript
jQuery+Ajax+PHP弹出层异步登录效果(附源码下载)
May 27 Javascript
js绑定事件和解绑事件
Apr 27 Javascript
bootstrap+jquery项目引入文件报错的解决方法
Jan 22 jQuery
TypeScript类型声明书写详解
Aug 28 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性能优化准备篇图解PEAR安装
2011/12/05 PHP
php面向对象之反射功能与用法分析
2017/03/29 PHP
Laravel 默认邮箱登录改成用户名登录的实现方法
2019/08/12 PHP
jQuery中文入门指南,翻译加实例,jQuery的起点教程
2007/01/13 Javascript
大家未必知道的Js技巧收藏
2008/04/07 Javascript
js url传值中文乱码之解决之道
2009/11/20 Javascript
JSQL 基于客户端的成绩统计实现方法
2010/05/05 Javascript
JS 控制小数位数的实现代码
2011/08/02 Javascript
如何将一个String和多个String值进行比较思路分析
2013/04/22 Javascript
ExtJS自定义主题(theme)样式详解
2013/11/18 Javascript
根据user-agent判断蜘蛛代码黑帽跳转代码(js版与php版本)
2015/09/14 Javascript
Node.js用readline模块实现输入输出
2016/12/16 Javascript
yii form 表单提交之前JS在提交按钮的验证方法
2017/03/15 Javascript
基于vue-simplemde实现图片拖拽、粘贴功能
2018/04/12 Javascript
vue-devtools的安装步骤
2018/04/23 Javascript
[07:52]2014DOTA2 TI逗比武士游V社解说背后的故事
2014/07/10 DOTA
在Python的Django框架下使用django-tagging的教程
2015/05/30 Python
Python和JavaScript间代码转换的4个工具
2016/02/22 Python
Python中asyncore异步模块的用法及实现httpclient的实例
2016/06/28 Python
一个基于flask的web应用诞生 用户注册功能开发(5)
2017/04/11 Python
python使用ctypes调用扩展模块的实例方法
2020/01/28 Python
tensorflow 实现自定义梯度反向传播代码
2020/02/10 Python
mac 上配置Pycharm连接远程服务器并实现使用远程服务器Python解释器的方法
2020/03/19 Python
Jupyter Notebook远程登录及密码设置操作
2020/04/10 Python
python 双循环遍历list 变量判断代码
2020/05/04 Python
python如何安装下载后的模块
2020/07/03 Python
Python如何设置指定窗口为前台活动窗口
2020/08/12 Python
用HTML5制作一个简单的桌球游戏的教程
2015/05/12 HTML / CSS
美国按摩椅批发网站:Titan Chair
2018/12/27 全球购物
女性时尚网购:Chic Me
2019/07/30 全球购物
德国受欢迎的旅游和休闲网站:lastminute.de
2019/09/23 全球购物
经典c++面试题二
2015/08/14 面试题
大学生学期个人总结
2015/02/12 职场文书
保送生自荐信范文
2015/03/26 职场文书
2015年暑期社会实践方案
2015/07/14 职场文书
宣传稿格式范文
2015/07/23 职场文书