快速掌握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在一段文字中的光标处插入其他文字
Aug 26 Javascript
jQuery事件绑定.on()简要概述及应用
Feb 07 Javascript
javascript函数重载解决方案分享
Feb 19 Javascript
javascript实现网页字符定位的方法
Jul 14 Javascript
javascript结合Flexbox简单实现滑动拼图游戏
Feb 18 Javascript
利用JQuery写一个简单的异步分页插件
Mar 07 Javascript
浅析上传头像示例及其注意事项
Dec 14 Javascript
基于BootStrap的前端分页带省略号和上下页效果
May 18 Javascript
vue无限轮播插件代码实例
May 10 Javascript
layui的布局和表格的渲染以及动态生成表格的方法
Sep 18 Javascript
vue-以文件流-blob-的形式-下载-导出文件操作
Aug 07 Javascript
JavaScript 生成唯一ID的几种方式
Feb 19 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
基于Snoopy的PHP近似完美获取网站编码的代码
2011/10/23 PHP
33道php常见面试题及答案
2015/07/06 PHP
json简单介绍
2008/06/10 Javascript
seajs1.3.0源码解析之module依赖有序加载
2012/11/07 Javascript
jQuery动画效果-slideUp slideDown上下滑动示例代码
2013/08/28 Javascript
JavaScript设计模式初探
2016/01/07 Javascript
扩展Bootstrap Tooltip插件使其可交互的方法
2016/11/07 Javascript
js使用ajax传值给后台,后台返回字符串处理方法
2018/08/08 Javascript
layui上传图片到服务器的非项目目录下的方法
2019/09/26 Javascript
vue 实现 rem 布局或vw 布局的方法
2019/11/13 Javascript
js实现点击生成随机div
2020/01/16 Javascript
jQuery带控制按钮轮播图插件
2020/07/31 jQuery
Vue v-for中的 input 或 select的值发生改变时触发事件操作
2020/08/31 Javascript
Vue 解决在element中使用$notify在提示信息中换行问题
2020/11/11 Javascript
[03:04]DOTA2英雄基础教程 影魔
2013/12/11 DOTA
Python解决鸡兔同笼问题的方法
2014/12/20 Python
Python中django学习心得
2017/12/06 Python
Python过滤txt文件内重复内容的方法
2018/10/21 Python
对Python多线程读写文件加锁的实例详解
2019/01/14 Python
Python读取Pickle文件信息并计算与当前时间间隔的方法分析
2019/01/30 Python
python opencv 图像拼接的实现方法
2019/06/27 Python
pandas-resample按时间聚合实例
2019/12/27 Python
python实现斗地主分牌洗牌
2020/06/22 Python
深入了解Python 变量作用域
2020/07/24 Python
记一次python 爬虫爬取深圳租房信息的过程及遇到的问题
2020/11/24 Python
selenium+python自动化78-autoit参数化与批量上传功能的实现
2021/03/04 Python
HTML5之HTML元素扩展(上)—新增加的元素及使用概述
2013/01/31 HTML / CSS
3种方式实现瀑布流布局小结
2019/09/05 HTML / CSS
PatPat香港:婴童服饰和亲子全家装在线购物
2020/09/27 全球购物
什么是ARP(Address Resolution Protocol)地址解析协议
2013/10/31 面试题
户外亲子活动策划方案
2014/02/07 职场文书
2014年中班下学期工作总结
2014/12/11 职场文书
2014年环保局工作总结
2014/12/11 职场文书
2016年寒假社会实践活动心得体会
2015/10/09 职场文书
详解redis在微服务领域的贡献
2021/10/16 Redis
CSS 一行代码实现头像与国旗的融合
2021/10/24 HTML / CSS