快速掌握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 相关文章推荐
jquery点击页面任何区域实现鼠标焦点十字效果
Jun 21 Javascript
Jquery 在页面加载后执行的几种方式
Mar 14 Javascript
node.js中的fs.chmod方法使用说明
Dec 18 Javascript
js+css实现tab菜单切换效果的方法
Jan 20 Javascript
jQuery获取DOM节点实例分析(2种方式)
Dec 15 Javascript
javascript中类的定义方式详解(四种方式)
Dec 22 Javascript
原生JS实现平滑回到顶部组件
Mar 16 Javascript
从零学习node.js之文件操作(三)
Feb 21 Javascript
微信小程序用户自定义模版用法实例分析
Nov 28 Javascript
vue2.0 实现页面导航提示引导的方法
Mar 13 Javascript
深入理解JS的事件绑定、事件流模型
May 13 Javascript
Nuxt的路由配置和参数传递方式
Nov 06 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版(3)
2006/10/09 PHP
基于php-fpm 参数的深入理解
2013/06/03 PHP
PHP使用header()输出图片缓存实例
2014/12/09 PHP
php简单判断文本编码的方法
2015/07/30 PHP
thinkPHP中多维数组的遍历方法
2016/01/09 PHP
利用php_imagick实现复古效果的方法
2016/10/18 PHP
PHP静态成员变量
2017/02/14 PHP
jQuery TextBox自动完成条
2009/07/22 Javascript
jQuery.event兼容各浏览器的event详细解析
2013/12/18 Javascript
100个不能错过的实用JS自定义函数
2014/03/05 Javascript
通过$(this)使用jQuery包装后的方法或属性
2014/05/18 Javascript
JavaScript使用简单正则表达式的数据验证功能示例
2017/01/13 Javascript
JavaScript正则表达式校验与递归函数实际应用实例解析
2017/08/04 Javascript
通俗解释JavaScript正则表达式快速记忆
2017/08/23 Javascript
Three.js实现浏览器变动时进行自适应的方法
2017/09/26 Javascript
浅谈Vue数据绑定的原理
2018/01/08 Javascript
AngularJS修改model值时,显示内容不变的实例
2018/09/13 Javascript
vue 返回上一页,页面样式错乱的解决
2019/11/14 Javascript
vue新建项目并配置标准路由过程解析
2019/12/09 Javascript
在Chrome DevTools中调试JavaScript的实现
2020/04/07 Javascript
JavaScript实现动态生成表格
2020/08/02 Javascript
js数组的基本使用总结
2021/01/18 Javascript
零基础写python爬虫之爬虫编写全记录
2014/11/06 Python
Python 模拟登陆的两种实现方法
2017/08/10 Python
Python读取txt内容写入xls格式excel中的方法
2018/10/11 Python
在pycharm中配置Anaconda以及pip源配置详解
2019/09/09 Python
Python re正则表达式元字符分组()用法分享
2020/02/10 Python
django表单中的按钮获取数据的实例分析
2020/07/31 Python
CSS3 text-shadow实现文字阴影效果
2016/02/24 HTML / CSS
美国知名玩具品牌:Melissa & Doug
2016/08/16 全球购物
旅游业大学生创业计划书
2014/01/31 职场文书
中学生期末评语
2014/02/03 职场文书
护理中职生求职信范文
2014/02/24 职场文书
艺术节主持词
2014/04/02 职场文书
学生检讨书
2015/01/27 职场文书
解析:创业计划书和商业计划书二者之间到底有什么区别
2019/08/14 职场文书