快速掌握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 this用法小结
Dec 19 Javascript
javascript实现文本域写入字符时限定字数
Feb 12 Javascript
取得元素的左和上偏移量的方法
Sep 17 Javascript
关于Function中的bind()示例详解
Dec 02 Javascript
微信小程序 省市区选择器实例详解(附源码下载)
Jan 05 Javascript
layer弹窗插件操作方法详解
May 19 Javascript
浅谈Node.js CVE-2017-14849 漏洞分析(详细步骤)
Nov 10 Javascript
浅谈webpack组织模块的原理
Mar 10 Javascript
django js 实现表格动态标序号的实例代码
Jul 12 Javascript
Vue清除定时器setInterval优化方案分享
Jul 21 Javascript
JavaScript实现前端网页版倒计时
Mar 24 Javascript
React更新渲染原理深入分析
Dec 24 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
利用discuz自带通行证整合dedecms的方法以及文件下载
2007/03/06 PHP
php array_intersect()函数使用代码
2009/01/14 PHP
php导入csv文件碰到乱码问题的解决方法
2014/02/10 PHP
php自动给网址加上链接的方法
2015/06/02 PHP
PHP排序算法之基数排序(Radix Sort)实例详解
2018/04/21 PHP
ECMAScript 创建自己的js类库
2012/11/22 Javascript
jquery ajax 调用失败的原因示例介绍
2013/09/27 Javascript
jQuery的$.proxy()应用示例介绍
2014/04/03 Javascript
js获取域名的方法
2015/01/27 Javascript
jquery.mobile 共同布局遇到的问题小结
2015/02/10 Javascript
基于jQuery的网页影音播放器jPlayer的基本使用教程
2016/03/08 Javascript
JS实现“隐藏与显示”功能(多种方法)
2016/11/24 Javascript
JavaScript实现自定义媒体播放器方法介绍
2017/01/03 Javascript
jQuery中DOM节点删除之empty与remove
2017/01/20 Javascript
js+html制作简单验证码
2017/02/16 Javascript
前端主流框架vue学习笔记第二篇
2017/07/26 Javascript
微信小程序实现跟随菜单效果和循环嵌套加载数据
2017/11/21 Javascript
简单易扩展可控性强的Jquery转盘抽奖程序
2019/03/16 jQuery
laypage+SpringMVC实现后端分页
2019/07/27 Javascript
实例讲解Python中函数的调用与定义
2016/03/14 Python
利用Python正则表达式过滤敏感词的方法
2019/01/21 Python
浅析Windows 嵌入python解释器的过程
2019/07/26 Python
python tkinter实现彩球碰撞屏保
2019/07/30 Python
TensorFlow保存TensorBoard图像操作
2020/06/23 Python
Python DataFrame使用drop_duplicates()函数去重(保留重复值,取重复值)
2020/07/20 Python
Python使用grequests并发发送请求的示例
2020/11/05 Python
HTML5之语义标签介绍
2016/07/07 HTML / CSS
理肤泉加拿大官网:La Roche-Posay加拿大
2018/07/06 全球购物
五一促销活动总结
2014/07/01 职场文书
小学校园广播稿
2015/08/18 职场文书
实验心得体会范文
2016/01/25 职场文书
写自招自荐信的绝招!
2019/04/19 职场文书
redis cluster支持pipeline的实现思路
2021/06/23 Redis
Vue提供的三种调试方式你知道吗
2022/01/18 Vue.js
用Python仅20行代码编写一个简单的端口扫描器
2022/04/08 Python
Python 第三方库 openpyxl 的安装过程
2022/12/24 Python