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 相关文章推荐
Discuz! 6.1_jQuery兼容问题
Sep 23 Javascript
js下将字符串当函数执行的方法
Jul 13 Javascript
解析JavaScript中的不可见数据类型
Dec 02 Javascript
兼容所有浏览器的js复制插件Zero使用介绍
Mar 19 Javascript
JS兼容浏览器的导出Excel(CSV)文件的方法
May 03 Javascript
node.js中的fs.readFile方法使用说明
Dec 15 Javascript
详解JavaScript基于面向对象之继承
Dec 13 Javascript
JS数组合并push与concat区别分析
Dec 17 Javascript
javascript下使用Promise封装FileReader
Feb 19 Javascript
Node.JS段点续传:Nginx配置文件分段下载功能的实现方法
Mar 12 Javascript
解决Layui 表格自适应高度的问题
Nov 15 Javascript
jquery实现进度条状态展示
Mar 26 jQuery
走进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版)
2006/10/09 PHP
第七节--类的静态成员
2006/11/16 PHP
php数据库备份还原类分享
2014/03/20 PHP
php调用自己java程序的方法详解
2016/05/13 PHP
基于swoole实现多人聊天室
2018/06/14 PHP
tp5 实现列表数据根据状态排序
2019/10/18 PHP
javascript 动态设置已知select的option的value值的代码
2009/12/16 Javascript
jQuery 阴影插件代码分享
2012/01/09 Javascript
JQuery实现绚丽的横向下拉菜单
2013/12/19 Javascript
异步JavaScript编程中的Promise使用方法
2015/07/28 Javascript
Angular 常用指令实例总结整理
2016/12/13 Javascript
浅谈JavaScript的函数及作用域
2016/12/30 Javascript
javascript实现秒表计时器的制作方法
2017/02/16 Javascript
Angular2库初探
2017/03/01 Javascript
JS实现双击内容变为可编辑状态
2017/03/03 Javascript
angularjs中回车键触发某一事件的方法
2017/04/24 Javascript
详解如何在vue项目中引入elementUI组件
2018/02/11 Javascript
js实现旋转的星空效果
2019/11/01 Javascript
JS实现长图上下滚动效果
2020/03/19 Javascript
vue实现在进行增删改操作后刷新页面
2020/08/05 Javascript
搭建vscode+vue环境的详细教程
2020/08/31 Javascript
python删除文件示例分享
2014/01/28 Python
在Python的框架中为MySQL实现restful接口的教程
2015/04/08 Python
win10系统中安装scrapy-1.1
2016/07/03 Python
基于Python_脚本CGI、特点、应用、开发环境(详解)
2017/05/23 Python
Python编程之序列操作实例详解
2017/07/22 Python
http请求 request失败自动重新尝试代码示例
2018/01/25 Python
Python学习笔记之open()函数打开文件路径报错问题
2018/04/28 Python
对python中for、if、while的区别与比较方法
2018/06/25 Python
python3 tkinter实现点击一个按钮跳出另一个窗口的方法
2019/06/13 Python
Python闭包与装饰器原理及实例解析
2020/04/30 Python
Python类class参数self原理解析
2020/11/19 Python
优质的学校老师推荐信
2013/10/28 职场文书
房屋租房协议书范本
2014/12/04 职场文书
2014年节能减排工作总结
2014/12/06 职场文书
python实现大文本文件分割成多个小文件
2021/04/20 Python