快速掌握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 相关文章推荐
用JS判别浏览器种类以及IE版本的几种方法小结
Aug 02 Javascript
javascript实现div的拖动并调整大小类似qq空间个性编辑模块
Dec 12 Javascript
jQuery在ul中显示某个li索引号的方法
Mar 17 Javascript
js实现使用鼠标拖拽切换图片的方法
May 04 Javascript
CSS javascript 结合实现悬浮固定菜单效果
Aug 23 Javascript
总结JavaScript三种数据存储方式之间的区别
May 03 Javascript
AngularJS控制器之间的通信方式详解
Nov 03 Javascript
vue中vee validate表单校验的几种基本使用
Jun 25 Javascript
js实现轮播图特效
May 28 Javascript
Vue实现计算器计算效果
Aug 17 Javascript
vue实现tab栏点击高亮效果
Aug 19 Javascript
多种类型jQuery网页验证码插件代码实例
Jan 09 jQuery
快速掌握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学习之数组的定义和填充
2011/04/17 PHP
Yii中CGridView关联表搜索排序方法实例详解
2014/12/03 PHP
php运行时动态创建函数的方法
2015/03/16 PHP
php读取出一个文件夹及其子文件夹下所有文件的方法示例
2017/06/15 PHP
OAuth认证协议中的HMACSHA1加密算法(实例)
2017/10/25 PHP
php实现等比例压缩图片
2018/07/26 PHP
通过javascript获取iframe里的值示例代码
2013/06/24 Javascript
流量统计器如何鉴别C#:WebBrowser中伪造referer
2015/01/07 Javascript
jQuery Ajax调用WCF服务详细教程
2015/03/31 Javascript
浅谈JavaScript中运算符的优先级
2015/07/07 Javascript
探讨JavaScript中的Rest参数和参数默认值
2015/07/29 Javascript
浅谈DOCTYPE对$(window).height()取值的影响
2016/07/21 Javascript
js判断浏览器是否支持严格模式的方法
2016/10/04 Javascript
jQuery继承extend用法详解
2016/10/10 Javascript
javascript表达式和运算符详解
2017/02/07 Javascript
JQuery事件冒泡和默认行为代码实例
2020/05/13 jQuery
微信小程序实现页面左右滑动
2020/11/16 Javascript
js实现随机点名功能
2020/12/23 Javascript
[02:57]DOTA2亚洲邀请赛小组赛第四日 赛事回顾
2015/02/02 DOTA
Python中操作文件之write()方法的使用教程
2015/05/25 Python
基于Python对象引用、可变性和垃圾回收详解
2017/08/21 Python
Python自定义装饰器原理与用法实例分析
2018/07/16 Python
Django ORM 查询管理器源码解析
2019/08/05 Python
pytorch 固定部分参数训练的方法
2019/08/17 Python
基于HTML5新特性Mutation Observer实现编辑器的撤销和回退操作
2016/01/11 HTML / CSS
C#面试题问题集
2016/04/02 面试题
如何写自我鉴定
2014/03/19 职场文书
求职意向书范文
2014/04/01 职场文书
节电标语大全
2014/06/23 职场文书
先进教师个人总结
2015/02/11 职场文书
银行资信证明
2015/06/17 职场文书
《金钱的魔力》教学反思
2016/02/20 职场文书
世界文化遗产导游词
2019/08/07 职场文书
sql server删除前1000行数据的方法实例
2021/08/30 SQL Server
SQL Server中的逻辑函数介绍
2022/05/25 SQL Server
python playwrigh框架入门安装使用
2022/07/23 Python