快速掌握Node.js事件驱动模型


Posted in Javascript onMarch 21, 2016

一、传统线程网络模型

在了解Node.js事件驱动模型之前,我们先了解一下传统的线程网络模型,请求进入web服务器(IIS、Apache)之后,会在线程池中分配一个线程来线性同步完成请求处理,直到请求处理完成并发出响应,结束之后线程池回收。

这就会就会带来以下几个问题 :

1.由于线程池中线程个数有限,对于频繁请求时,就会出现等待,严重的甚至会把服务器挂掉

2.对于高并发的时候,为了防止出现脏数据就会使用锁来解决,一些I/O事务可能消耗很长得时间,这样就会出现一些线程等待,效率低下

快速掌握Node.js事件驱动模型

二、事件驱动模型

1.在Node.js中有一个事件队列,每个任务都会放入事件队列中,都会留下处理结果的回调函数,事件循环线程(个人感觉有点类似ios中的RunLoop)处理事件队列中的任务,直到回调函数不再存在。

2. 在无阻塞的情况下,作为一个带有回调的函数被放入事件队列中,事件循环线程中被提取并执行。

3.当执行过程中遇到I/O阻塞(读取文件、查询数据库、请求套接字、访问远程服务等)时,事件循环线程不会停下等待结果,转而继续执行队列中的下一个任务,不会在事件循环线程中执行。在函数执行时,Node.js在事件队列中放置回调函数,它的顺序根据函数的完成快慢决定。

快速掌握Node.js事件驱动模型

4.在1中也说了当遇到I/O阻塞,循环线程不会等待结果,转而执行队列中的下一个任务,那是该由谁来执行这个I/O操作呢?

Node.js使用事件回调来避免对阻塞I/O的等待,在后台实现线程池,当遇到I/O阻塞任务时,会从线程池中获取一个线程,将该函数及回调在那里执行,在被阻塞的线程上执行的回调函数仍然可以把事件添加到事件队列中。

快速掌握Node.js事件驱动模型

以上就是关于Node.js事件驱动模型的全部内容,希望对大家的学习有所帮助。

Javascript 相关文章推荐
javascript 有用的脚本函数
May 07 Javascript
fancybox1.3.1 基于Jquery的插件在IE中图片显示问题
Oct 01 Javascript
js中将URL中的参数提取出来作为对象的实现代码
Aug 16 Javascript
JavaScript生成二维码图片小结
Dec 27 Javascript
jQuery获取父元素及父节点的方法小结
Apr 14 Javascript
AngularJS 服务详细讲解及示例代码
Aug 17 Javascript
微信小程序三级联动选择器使用方法
May 19 Javascript
理顺8个版本vue的区别(小结)
Sep 17 Javascript
Vue指令指令大全
Feb 09 Javascript
使用element-ui table expand展开行实现手风琴效果
Mar 15 Javascript
详解Element-UI中上传的文件前端处理
Aug 07 Javascript
原生js拖拽功能制作滑动条实例代码
Feb 05 Javascript
快速掌握Node.js模块封装及使用
Mar 21 #Javascript
JS DOM实现鼠标滑动图片效果
Sep 17 #Javascript
实践中学习AngularJS表单
Mar 21 #Javascript
javascript单页面手势滑屏切换原理详解
Mar 21 #Javascript
javascript实现dom元素可拖动
Mar 21 #Javascript
AngularJS 中的指令实践开发指南(一)
Mar 20 #Javascript
浅析AngularJS中的指令
Mar 20 #Javascript
You might like
PHP实现的权重算法示例【可用于游戏根据权限来随机物品】
2019/02/15 PHP
基于laravel Request的所有方法详解
2019/09/29 PHP
js读取本地excel文档数据的代码
2010/11/11 Javascript
浅说js变量
2011/05/25 Javascript
js Function类型
2011/12/04 Javascript
JavaScript严格模式禁用With语句的原因
2014/10/20 Javascript
JQuery中clone方法复制节点
2015/05/18 Javascript
完美实现八种js焦点轮播图(上篇)
2016/07/18 Javascript
javascript 动态脚本添加的简单方法
2016/10/11 Javascript
jQuery实现的仿百度,仿谷歌搜索下拉框效果示例
2016/12/30 Javascript
jQuery Tree Multiselect使用详解
2017/05/02 jQuery
Angular 4依赖注入学习教程之简介(一)
2017/06/04 Javascript
bootstrap multiselect 多选功能实现方法
2017/06/05 Javascript
微信小程序之电影影评小程序制作代码
2017/08/03 Javascript
通过函数作用域和块级作用域看javascript的作用域链
2018/08/05 Javascript
微信小程序自定义可滑动日历界面
2018/12/28 Javascript
JavaScript闭包与作用域链实例分析
2019/01/21 Javascript
Node.js Event Loop各阶段讲解
2019/03/08 Javascript
ES6的异步操作之promise用法和async函数的具体使用
2019/12/06 Javascript
JavaScript数组排序小程序实现解析
2020/01/13 Javascript
JavaScript indexOf()原理及使用方法详解
2020/07/09 Javascript
[43:47]完美世界DOTA2联赛PWL S3 LBZS vs Phoenix 第一场 12.09
2020/12/11 DOTA
Python基于WordCloud制作词云图
2019/11/29 Python
Python自动化之UnitTest框架实战记录
2020/09/08 Python
Python 爬取淘宝商品信息栏目的实现
2021/02/06 Python
哈理工毕业生的求职信
2013/12/22 职场文书
好军嫂事迹材料
2014/01/15 职场文书
办公室主任职责范本
2014/03/07 职场文书
史学专业毕业生求职信
2014/05/09 职场文书
小学教师师德承诺书
2014/05/23 职场文书
行政管理专业求职信
2014/07/06 职场文书
党支部三严三实对照检查材料思想汇报
2014/09/29 职场文书
教师四风自我剖析材料
2014/09/30 职场文书
电子银行业务授权委托书
2014/10/10 职场文书
房贷收入证明范本
2015/06/12 职场文书
python 制作一个gui界面的翻译工具
2021/05/14 Python