快速掌握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_01_理解内存分配原理分析
Oct 11 Javascript
JQuery入门——用映射方式绑定不同事件应用示例
Feb 05 Javascript
js 去掉空格实例 Trim() LTrim() RTrim()
Jan 07 Javascript
动态创建script在IE中缓存js文件时导致编码的解决方法
May 04 Javascript
Javascript数组与字典用法分析
Dec 13 Javascript
JavaScript通过function定义对象并给对象添加toString()方法实例分析
Mar 23 Javascript
jQuery滚动条插件nanoscroller使用指南
Apr 21 Javascript
jQuery聚合函数实例
May 21 Javascript
Vue-router 类似Vuex实现组件化开发的示例
Sep 15 Javascript
详解React之父子组件传递和其它一些要点
Jun 25 Javascript
ng-alain表单使用方式详解
Jul 10 Javascript
深入Node TCP模块的理解
Mar 13 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加水印的代码(支持半透明透明打水印,支持png透明背景)
2013/01/17 PHP
php利用事务处理转账问题
2015/04/22 PHP
PHP实现按之字形顺序打印二叉树的方法
2018/01/16 PHP
cssQuery()的下载与使用方法
2007/01/12 Javascript
input、button的不同type值在ajax提交表单时导致的陷阱
2009/02/24 Javascript
ExtJs GridPanel简单的增删改实现代码
2010/08/26 Javascript
基于jquery的图片轮播 tab切换组件
2012/07/19 Javascript
几种延迟加载JS代码的方法加快网页的访问速度
2013/10/12 Javascript
解析offsetHeight,clientHeight,scrollHeight之间的区别
2013/11/20 Javascript
两个数组去重的JS代码
2013/12/04 Javascript
jquery ajax jsonp跨域调用实例代码
2013/12/11 Javascript
JS获取url链接字符串 location.href
2013/12/23 Javascript
Javascript判断图片尺寸大小实例分析
2014/06/16 Javascript
jQuery实现div拖拽效果实例分析
2016/02/20 Javascript
JS获取年月日时分秒的方法分析
2016/11/28 Javascript
详解微信小程序 wx.uploadFile 的编码坑
2017/01/23 Javascript
Vue2.2.0+新特性整理及注意事项
2018/08/22 Javascript
解决angularjs WdatePicker ng-model的问题
2018/09/13 Javascript
如何从0开始用node写一个自己的命令行程序
2018/12/29 Javascript
微信小程序实现时间戳格式转换
2020/07/20 Javascript
Python中的Descriptor描述符学习教程
2016/06/02 Python
详解python中list的使用
2019/03/15 Python
python 实现查询Neo4j多节点的多层关系
2019/12/23 Python
利用django model save方法对未更改的字段依然进行了保存
2020/03/28 Python
tensorflow图像裁剪进行数据增强操作
2020/06/30 Python
html5 postMessage解决跨域、跨窗口消息传递方案
2016/12/20 HTML / CSS
写一个函数,要求输入一个字符串和一个字符长度,对该字符串进行分隔
2015/07/30 面试题
教学器材管理制度
2014/01/26 职场文书
药学专业学生的自我评价分享
2014/02/06 职场文书
如何写一封打动人心的求职信
2014/02/17 职场文书
个人委托书范本
2014/04/02 职场文书
2015届大学生就业推荐表自我评价
2014/09/27 职场文书
雷锋观后感
2015/06/10 职场文书
2015年社区国庆节活动总结
2015/07/30 职场文书
初中军训感想
2015/08/07 职场文书
一定要知道的 25 个 Vue 技巧
2021/11/02 Vue.js