快速掌握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的prototype属性
Feb 11 Javascript
struts2+jquery组合验证注册用户是否存在
Apr 30 Javascript
JavaScript数组前面插入元素的方法
Apr 06 Javascript
JavaScript控制网页层收起和展开效果的方法
Apr 15 Javascript
js和jquery分别验证单选框、复选框、下拉框
Dec 17 Javascript
Bootstrap框架下下拉框select搜索功能
Mar 26 Javascript
使用JS读取XML文件的方法
Nov 25 Javascript
通过构造函数实例化对象的方法
Jun 28 Javascript
js实现图片上传预览原理分析
Jul 13 Javascript
在vue项目中,使用axios跨域处理
Mar 07 Javascript
Vue发布订阅模式实现过程图解
Apr 30 Javascript
微信小程序文章列表功能完整实例
Jun 03 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
下载文件的点击数回填
2006/10/09 PHP
php导入excel文件到mysql数据库的方法
2015/01/14 PHP
PHP面向对象之里氏替换原则简单示例
2018/04/08 PHP
单独使用CKFinder选择图片的方法
2010/08/21 Javascript
JavaScript 字符串处理函数使用小结
2010/12/02 Javascript
JavaScript获取表单enctype属性的方法
2015/04/02 Javascript
javascript禁止访客复制网页内容的实现代码
2015/08/05 Javascript
jquery.validate提示错误信息位置方法
2016/01/22 Javascript
node.js cookie-parser 中间件介绍
2016/06/06 Javascript
浅谈JavaScript变量的自动转换和语句
2016/06/12 Javascript
浅谈Nodejs应用主文件index.js
2016/08/28 NodeJs
轻松实现jQuery添加删除按钮Click事件
2017/03/13 Javascript
Kindeditor单独调用单图上传增加预览功能的实例
2017/07/31 Javascript
在vue中封装可复用的组件方法
2018/03/01 Javascript
JS使用cookie保存用户登录信息操作示例
2019/05/30 Javascript
Openlayers学习之加载鹰眼控件
2020/09/28 Javascript
js基于canvas实现时钟组件
2021/02/07 Javascript
Python中的高级函数map/reduce使用实例
2015/04/13 Python
Python中title()方法的使用简介
2015/05/20 Python
解决出现Incorrect integer value: '' for column 'id' at row 1的问题
2017/10/29 Python
python 求1-100之间的奇数或者偶数之和的实例
2019/06/11 Python
Django urls.py重构及参数传递详解
2019/07/23 Python
高考备战决心书
2014/03/11 职场文书
乔迁之喜主持词
2014/03/27 职场文书
小区文明倡议书
2014/05/16 职场文书
国贸专业毕业求职信
2014/06/11 职场文书
乡镇党员干部群众路线对照检查材料思想汇报
2014/09/28 职场文书
2014年新农村建设工作总结
2014/12/01 职场文书
2014年卫生院工作总结
2014/12/03 职场文书
5.12护士节活动总结
2015/02/10 职场文书
幼儿园重阳节活动总结
2015/05/05 职场文书
《没有任何借口》读后感:完美的执行能力
2020/01/07 职场文书
新手入门Mysql--sql执行过程
2021/06/20 MySQL
golang中的struct操作
2021/11/11 Golang
Windows Server 2012 R2 磁盘分区教程
2022/04/29 Servers
windows10 家庭版下FTP服务器搭建教程
2022/08/05 Servers