快速掌握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 相关文章推荐
用js实现的抽象CSS圆角效果!!
May 03 Javascript
window.event.keyCode兼容IE和Firefox实现js代码
May 30 Javascript
js调用css属性写法
Sep 21 Javascript
使用AmplifyJS组件配合JavaScript进行编程的指南
Jul 28 Javascript
AngularJS模块学习之Anchor Scroll
Jan 19 Javascript
jquery form表单获取内容以及绑定数据
Feb 24 Javascript
Bootstrap Table使用方法详解
Aug 01 Javascript
JavaScript中的this陷阱的最全收集并整理(没有之一)
Feb 21 Javascript
关于JavaScript中的this指向问题总结篇
Jul 23 Javascript
JavaScript实现数组全排列、去重及求最大值算法示例
Jul 30 Javascript
jQuery中常用动画效果函数知识点整理
Aug 19 jQuery
vue使用微信扫一扫功能的实现代码
Apr 11 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
php中的ini配置原理详解
2014/10/14 PHP
php线性表的入栈与出栈实例分析
2015/06/12 PHP
PHP之密码加密的几种方式
2015/07/29 PHP
给WordPress的编辑后台添加提示框的代码实例分享
2015/12/25 PHP
使用ThinkPHP的自动完成实现无限级分类实例详解
2016/09/02 PHP
Swoole 5将移除自动添加Event::wait()特性详解
2019/07/10 PHP
js String对象中常用方法小结(字符串操作)
2012/01/27 Javascript
JavaScript 命名空间 使用介绍
2013/08/29 Javascript
js控制表单不能输入空格的小例子
2013/11/20 Javascript
node.js不得不说的12点内容
2014/07/14 Javascript
jQuery实现为控件添加水印文字效果(附源码)
2015/12/02 Javascript
基于jQuery实现淡入淡出效果轮播图
2020/07/31 Javascript
网络传输协议(http协议)
2016/11/18 Javascript
浅谈angularjs $http提交数据探索
2017/01/20 Javascript
探讨Vue.js的组件和模板
2017/10/27 Javascript
Vue axios全局拦截 get请求、post请求、配置请求的实例代码
2018/11/28 Javascript
Python实现求两个csv文件交集的方法
2017/09/06 Python
使用Python如何测试InnoDB与MyISAM的读写性能
2018/09/18 Python
python实现字符串中字符分类及个数统计
2018/09/28 Python
详解Python爬取并下载《电影天堂》3千多部电影
2019/04/26 Python
使用python3调用wxpy模块监控linux日志并定时发送消息给群组或好友
2019/06/05 Python
pandas中DataFrame修改index、columns名的方法示例
2019/08/02 Python
pycharm 安装JPype的教程
2019/08/08 Python
Python实现打印实心和空心菱形
2019/11/23 Python
Python监控服务器实用工具psutil使用解析
2019/12/19 Python
python_matplotlib改变横坐标和纵坐标上的刻度(ticks)方式
2020/05/16 Python
澳大利亚排名第一的儿童在线玩具商店:Toy Galaxy
2018/10/06 全球购物
What is view? why do we have view?
2012/06/22 面试题
网络工程师的自我评价
2013/10/02 职场文书
招商业务员岗位职责
2013/12/16 职场文书
党员公开承诺书范文
2014/03/25 职场文书
质量承诺书范文
2014/03/27 职场文书
小学生我的梦想演讲稿
2014/08/21 职场文书
倡议书的写法
2014/08/30 职场文书
百万英镑观后感
2015/06/09 职场文书
2016大学生求职自荐信范文
2016/01/28 职场文书