快速掌握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面向对象设计二 构造函数模式
Dec 20 Javascript
js+css实现增加表单可用性之提示文字
Jun 03 Javascript
js判断空对象的实例(超简单)
Jul 26 Javascript
微信小程序 网络API发起请求详解
Nov 09 Javascript
Vue.js项目部署到服务器的详细步骤
Jul 17 Javascript
浅谈webpack打包之后的文件过大的解决方法
Mar 07 Javascript
vue实现滑动切换效果(仅在手机模式下可用)
Jun 29 Javascript
操作按钮悬浮固定在微信小程序底部的实现代码
Aug 02 Javascript
vue 根据选择条件显示指定参数的例子
Nov 09 Javascript
js实现课堂随机点名系统
Nov 21 Javascript
webpack.DefinePlugin与cross-env区别详解
Feb 23 Javascript
swiper实现导航滚动效果
Dec 13 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的开合式多级菜单程序
2006/10/09 PHP
CI(CodeIgniter)框架配置
2014/06/10 PHP
PHP中把数据库查询结果输出为json格式简单实例
2015/04/09 PHP
关于Laravel Route重定向的一个注意点
2017/01/16 PHP
Laravel框架实现利用监听器进行sql语句记录功能
2018/06/06 PHP
PHP使用DOM对XML解析处理操作示例
2019/07/04 PHP
用显卡加速,轻松把笔记本打造成取暖器的办法!
2013/04/17 Javascript
jquery在项目中做复选框时遇到的一些问题笔记
2013/11/17 Javascript
js获取当前地址 JS获取当前URL的示例代码
2014/02/26 Javascript
js+css实现上下翻页相册代码分享
2015/08/18 Javascript
js实现温度计时间样式代码分享
2015/08/21 Javascript
JavaScript中Date对象的常用方法示例
2015/10/24 Javascript
Jquery和JS获取ul中li标签的实现方法
2016/06/02 Javascript
详解Bootstrap的iCheck插件checkbox和radio
2016/08/24 Javascript
JavaScript实现输入框与清空按钮联动效果
2016/09/09 Javascript
vue form 表单提交后刷新页面的方法
2018/09/04 Javascript
laypage.js分页插件使用方法详解
2019/07/27 Javascript
JS FormData对象使用方法实例详解
2020/02/12 Javascript
Python中__call__用法实例
2014/08/29 Python
Python中字符串的处理技巧分享
2016/09/17 Python
浅谈Python Opencv中gamma变换的使用详解
2018/04/02 Python
python将txt文件读取为字典的示例
2018/12/22 Python
python实现桌面壁纸切换功能
2019/01/21 Python
Python调用Windows API函数编写录音机和音乐播放器功能
2020/01/05 Python
Tensorflow 实现释放内存
2020/02/03 Python
python绘制动态曲线教程
2020/02/24 Python
Python多线程多进程实例对比解析
2020/03/12 Python
Python爬虫requests库多种用法实例
2020/05/28 Python
英国山地公路自行车商店:Tweeks Cycles
2018/03/16 全球购物
澳大利亚最受欢迎的美发用品目的地:AMR
2019/08/28 全球购物
2013年员工自我评价范文
2013/12/27 职场文书
网络宣传方案
2014/03/15 职场文书
政府领导干部个人对照检查材料思想汇报
2014/09/24 职场文书
幽灵公主观后感
2015/06/09 职场文书
编写python程序的90条建议
2021/04/14 Python
css display table 自适应高度、宽度问题的解决
2021/05/07 HTML / CSS