快速掌握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 相关文章推荐
ExtJs 表单提交登陆实现代码
Aug 19 Javascript
javascript真的不难-回顾一下基础知识
Jan 15 Javascript
javascript实现控制文字大中小显示
Apr 28 Javascript
jquery UI Datepicker时间控件的使用方法(终结版)
Nov 07 Javascript
浅谈如何实现easyui的datebox格式化
Jun 12 Javascript
Webpack打包慢问题的完美解决方法
Mar 16 Javascript
ES6学习笔记之map、set与数组、对象的对比
Mar 01 Javascript
微信小程序上传文件到阿里OSS教程
May 20 Javascript
jQuery层叠选择器用法实例分析
Jun 28 jQuery
JS模拟浏览器实现全局搜索功能
Sep 11 Javascript
vue项目中微信登录的实现操作
Sep 08 Javascript
vue项目实现减少app.js和vender.js的体积操作
Nov 12 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
Ajax PHP 边学边练 之三 数据库
2009/11/26 PHP
PHP中开发XML应用程序之基础篇 添加节点 删除节点 查询节点 查询节
2010/07/09 PHP
PHP数组循环操作详细介绍 附实例代码
2013/02/03 PHP
PHP利用MySQL保存session的实现思路及示例代码
2014/09/09 PHP
php静态文件生成类实例分析
2015/01/03 PHP
location.href 在IE6中不跳转的解决方法与推荐使用代码
2010/07/08 Javascript
innerHTML动态添加html代码和脚本兼容多个浏览器
2014/10/11 Javascript
jquery实现标签上移、下移、置顶
2015/04/26 Javascript
javascript实现动态表头及表列的展现方法
2015/07/14 Javascript
Javascript函数式编程语言
2015/10/11 Javascript
js日期插件dateHelp获取本月、三个月、今年的日期
2016/03/07 Javascript
jQuery的ajax和遍历数组json实例代码
2016/08/01 Javascript
通过Ajax使用FormData对象无刷新上传文件方法
2016/12/08 Javascript
javascript设计模式之单体模式学习笔记
2017/02/15 Javascript
axios学习教程全攻略
2017/03/26 Javascript
基于vue的验证码组件的示例代码
2019/01/22 Javascript
利用Vconsole和Fillder进行移动端抓包调试方法
2019/03/05 Javascript
JS实现的检验身份证格式并输出出生日期,年龄,性别,出生地示例
2019/05/17 Javascript
node中使用log4js4.x版本记录日志的方法
2019/08/20 Javascript
React中获取数据的3种方法及优缺点
2020/02/18 Javascript
js、jquery实现列表模糊搜索功能过程解析
2020/03/27 jQuery
解决Antd Table表头加Icon和气泡提示的坑
2020/11/17 Javascript
Python MySQLdb 使用utf-8 编码插入中文数据问题
2018/03/13 Python
python无限生成不重复(字母,数字,字符)组合的方法
2018/12/04 Python
OpenCV+Python识别车牌和字符分割的实现
2019/01/31 Python
TensorFLow 变量命名空间实例
2020/02/11 Python
Python能做什么
2020/06/02 Python
Python selenium爬虫实现定时任务过程解析
2020/06/08 Python
H5新属性audio音频和video视频的控制详解(推荐)
2016/12/09 HTML / CSS
"引用"与多态的关系
2013/02/01 面试题
国际贸易毕业生求职信范文
2014/02/21 职场文书
学习2014年全国两会心得体会
2014/03/12 职场文书
事业单位绩效考核实施方案
2014/03/27 职场文书
学校交通安全责任书
2014/08/25 职场文书
导游词之岳阳楼
2019/09/25 职场文书
laravel添加角色和模糊搜索功能的实现代码
2021/06/22 PHP