快速掌握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的25个步骤 千倍级效率提升
Feb 11 Javascript
用jquery实现自定义风格的滑动条实现代码
Apr 26 Javascript
javascript中的=等号个数问题两个跟三个有什么区别
Oct 23 Javascript
Bootstrap列表组学习使用
Feb 09 Javascript
详解webpack运行Babel教程
Jun 13 Javascript
JS浅拷贝和深拷贝原理与实现方法分析
Feb 28 Javascript
RxJS的入门指引和初步应用
Jun 15 Javascript
vue 实现滚动到底部翻页效果(pc端)
Jul 31 Javascript
node.js中Buffer缓冲器的原理与使用方法分析
Nov 23 Javascript
微信小程序关键字变色实现代码实例
Dec 13 Javascript
Antd下拉选择,自动匹配功能的实现
Oct 24 Javascript
vuex的数据渲染与修改浅析
Nov 26 Vue.js
快速掌握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
简单示例AJAX结合PHP代码实现登录效果代码
2008/07/25 PHP
让PHP COOKIE立即生效,不用刷新就可以使用
2011/03/09 PHP
php 伪造本地文件包含漏洞的代码
2011/11/03 PHP
CI框架使用composer安装的依赖包步骤与方法分析
2016/11/21 PHP
PHP使用Curl实现模拟登录及抓取数据功能示例
2018/04/27 PHP
PHP 进程池与轮询调度算法实现多任务的示例代码
2019/11/26 PHP
jQuery入门知识简介
2010/03/04 Javascript
JavaScript NaN和Infinity特殊值 [译]
2012/09/20 Javascript
jquery无法设置checkbox选中即没有变成选中状态
2014/03/27 Javascript
js实现异步循环实现代码
2016/02/16 Javascript
详解Matlab中 sort 函数用法
2016/03/20 Javascript
jQuery EasyUI Pagination实现分页的常用方法
2016/05/21 Javascript
JS中innerHTML和pasteHTML的区别实例分析
2016/06/22 Javascript
Javascript中this绑定的3种方法与比较
2016/10/13 Javascript
详解vuex 中的 state 在组件中如何监听
2017/05/23 Javascript
JS实现websocket长轮询实时消息提示的效果
2017/10/10 Javascript
简单的Vue异步组件实例Demo
2017/12/27 Javascript
详解vuex中mapState,mapGetters,mapMutations,mapActions的作用
2018/04/13 Javascript
Python异常处理总结
2014/08/15 Python
Python模拟百度登录实例详解
2016/01/20 Python
用Python解决计数原理问题的方法
2016/08/04 Python
遍历python字典几种方法总结(推荐)
2016/09/11 Python
对Python中DataFrame按照行遍历的方法
2018/04/08 Python
Python把csv数据写入list和字典类型的变量脚本方法
2018/06/15 Python
python 二维数组90度旋转的方法
2019/01/28 Python
python整合ffmpeg实现视频文件的批量转换
2019/05/31 Python
Python代理IP爬虫的新手使用教程
2019/09/05 Python
django 解决model中类写不到数据库中,数据库无此字段的问题
2020/05/20 Python
HTML5利用约束验证API来检查表单的输入数据的代码实例
2016/12/20 HTML / CSS
美国演唱会和体育门票购买网站:Ticketnetwork
2018/10/19 全球购物
英国领先的电视购物零售商:Ideal World
2019/03/18 全球购物
STRATHBERRY苏贝瑞包包官网:西班牙高级工匠手工打造
2020/11/10 全球购物
荷兰美妆护肤品海淘网站:Beautinow(中文)
2020/11/22 全球购物
商场消防管理制度
2014/01/12 职场文书
副护士长竞聘演讲稿
2014/04/30 职场文书
干货:如何写好观后感 !
2019/05/21 职场文书