快速掌握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开发技术大全 第4章 直接量与字符集
Jul 03 Javascript
推荐40款强大的 jQuery 导航插件和教程(上篇)
Sep 14 Javascript
jquery实现文字由下到上循环滚动的实例代码
Aug 09 Javascript
js借助ActiveXObject实现创建文件
Sep 29 Javascript
原生js做的手风琴效果的导航菜单
Nov 08 Javascript
jQuery表单验证功能实例
Aug 28 Javascript
JavaScript获取各大浏览器信息图示
Nov 20 Javascript
深入理解Node.js的HTTP模块
Oct 12 Javascript
js代码延迟一定时间后执行一个函数的实例
Feb 15 Javascript
Vue组件通信实践记录(推荐)
Aug 15 Javascript
jQuery实现表单动态添加与删除数据操作示例
Jul 03 jQuery
vue单页缓存方案分析及实现
Sep 25 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
【动漫杂谈】关于《请在T台上微笑》
2020/03/03 日漫
异世界新番又来了,同样是从零开始,男主的年龄降到5岁
2020/04/09 日漫
php 时间计算问题小结
2009/01/04 PHP
PHP中去掉字符串首尾空格的方法
2012/05/19 PHP
PHP 读取和编写 XML
2014/11/19 PHP
PHP处理大量表单字段的便捷方法
2015/02/07 PHP
php使用Jpgraph绘制柱形图的方法
2015/06/10 PHP
浅析PHP中Session可能会引起并发问题
2015/07/23 PHP
PHP上传图片到数据库并显示的实例代码
2019/12/20 PHP
jquery隐藏标签和显示标签的实例
2013/11/11 Javascript
jqeury-easyui-layout问题解决方法
2014/03/24 Javascript
使用window.prompt()实现弹出用户输入的对话框
2015/04/13 Javascript
JS获取文件大小方法小结
2015/12/08 Javascript
js原型链与继承解析(初体验)
2016/05/09 Javascript
JS简单判断字符在另一个字符串中出现次数的2种常用方法
2017/04/20 Javascript
Angular4 ElementRef的应用
2018/02/26 Javascript
JavaScript 九种跨域方式实现原理
2019/02/11 Javascript
elementUi vue el-radio 监听选中变化的实例代码
2019/06/28 Javascript
浅谈v-for 和 v-if 并用时筛选条件方法
2019/11/07 Javascript
js+for循环实现字符串自动转义的代码(把后面的字符替换前面的字符)
2020/12/24 Javascript
[01:14:05]《加油DOTA》第四期
2014/08/25 DOTA
[59:30]完美世界DOTA2联赛PWL S3 access vs LBZS 第二场 12.20
2020/12/23 DOTA
python实现监控windows服务并自动启动服务示例
2014/04/17 Python
在Python中使用全局日志时需要注意的问题
2015/05/06 Python
Python栈类实例分析
2015/06/15 Python
python实现二叉树的遍历
2017/12/11 Python
python MysqlDb模块安装及其使用详解
2018/02/23 Python
python定时任务 sched模块用法实例
2019/11/04 Python
Django多层嵌套ManyToMany字段ORM操作详解
2020/05/19 Python
德国电子商城:ComputerUniverse
2017/04/21 全球购物
美国存储和组织商店:The Container Store
2017/08/16 全球购物
知识竞赛活动方案
2014/02/18 职场文书
学校春季防火方案
2014/06/08 职场文书
2015年行政人事部工作总结
2015/05/13 职场文书
《刺客之王:C罗全景传记》:时代从来不会亏待手艺人
2019/11/28 职场文书
MySQL实现字段分割一行转多行的示例代码
2022/07/07 MySQL