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 相关文章推荐
jquery自定义下拉列表示例
Apr 25 Javascript
JavaScript获取指定元素位置的方法
Apr 08 Javascript
浅析javascript中的事件代理
Nov 06 Javascript
jQuery+JSON实现AJAX二级联动实例分析
Dec 18 Javascript
JQuery 设置checkbox值二次无效的解决方法
Jul 22 Javascript
JavaScript随机生成颜色的方法
Oct 15 Javascript
手动初始化Angular的模块与控制器
Dec 26 Javascript
整理关于Bootstrap排版的慕课笔记
Mar 29 Javascript
AngularJs 常用的过滤器
May 15 Javascript
jQuery中元素选择器(element)简单用法示例
May 14 jQuery
vue自定义底部导航栏Tabbar的实现代码
Sep 03 Javascript
详解es6新增数组方法简便了哪些操作
May 09 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编程中八种常见的文件操作方式
2006/11/19 PHP
PHP的分页功能
2007/03/21 PHP
表单复选框向PHP传输数据的代码
2007/11/13 PHP
php 文章调用类代码
2011/08/11 PHP
php调用方法mssql_fetch_row、mssql_fetch_array、mssql_fetch_assoc和mssql_fetch_objcect读取数据的区别
2012/08/08 PHP
ThinkPHP框架实现的邮箱激活功能示例
2018/06/15 PHP
JavaScript 10件让人费解的事情
2010/02/15 Javascript
jquery animate图片模向滑动示例代码
2011/01/26 Javascript
jquery getScript动态加载JS方法改进详解
2012/11/15 Javascript
jQuery实现公告文字左右滚动的实例代码
2013/10/29 Javascript
js 触发select onchange事件代码
2014/03/20 Javascript
IE6-IE9中tbody的innerHTML不能赋值的解决方法
2014/09/26 Javascript
vue双向数据绑定原理探究(附demo)
2017/01/17 Javascript
js实现仿购物车加减效果
2017/03/01 Javascript
JavaScript中字符串的常用操作方法及特殊字符
2018/03/18 Javascript
深入理解Promise.all
2018/08/08 Javascript
了解JavaScript中的选择器
2019/05/24 Javascript
Vue-Cli 3.0 中配置高德地图的两种方式
2019/06/19 Javascript
JS将时间秒转换成天小时分钟秒的字符串
2019/07/10 Javascript
微信小程序后端实现授权登录
2020/02/24 Javascript
Openlayers实现图形绘制
2020/09/28 Javascript
python重试装饰器示例
2014/02/11 Python
Python深度优先算法生成迷宫
2018/01/22 Python
python opencv3实现人脸识别(windows)
2018/05/25 Python
python读取LMDB中图像的方法
2018/07/02 Python
python使用 __init__初始化操作简单示例
2019/09/26 Python
详解用Pytest+Allure生成漂亮的HTML图形化测试报告
2020/03/31 Python
G-Form护具官方网站:美国运动保护装备
2019/09/04 全球购物
物业管理员岗位职责范文
2013/11/25 职场文书
金融事务专业求职信
2014/04/25 职场文书
试用期转正员工自我评价
2014/09/18 职场文书
2015学生会文艺部工作总结
2015/04/03 职场文书
2016年度员工工作表现评语
2015/12/02 职场文书
新学期小学班主任工作计划
2019/06/21 职场文书
海康机器人重磅发布全新算法开发平台VM4.2
2022/04/21 数码科技
Spring Data JPA框架的核心概念和Repository接口
2022/04/28 Java/Android