详解nodejs异步I/O和事件循环


Posted in NodeJs onJune 07, 2017

事件驱动模型

现在我们来看看nodejs中的事件驱动和异步I/O是如何实现的.

nodejs是单线程(single thread)运行的,通过一个事件循环(event-loop)来循环取出消息队列(event-queue)中的消息进行处理,处理过程基本上就是去调用该消息对应的回调函数。消息队列就是当一个事件状态发生变化时,就将一个消息压入队列中。

nodejs的时间驱动模型一般要注意下面几个点:

  1. 因为是单线程的,所以当顺序执行js文件中的代码的时候,事件循环是被暂停的。
  2. 当js文件执行完以后,事件循环开始运行,并从消息队列中取出消息,开始执行回调函数
  3. 因为是单线程的,所以当回调函数被执行的时候,事件循环是被暂停的
  4. 当涉及到I/O操作的时候,nodejs会开一个独立的线程来进行异步I/O操作,操作结束以后将消息压入消息队列。

下面我们从一个简单的js文件入手,来看看 nodejs是如何执行的。

var fs = require("fs");
var debug = require('debug')('example1');

debug("begin");

fs.readFile('package.json','utf-8',function(err,data){
 if(err) 
  debug(err);
 else
  debug("get file content");
});

setTimeout(function(){
 debug("timeout2");
});

 
debug('end'); // 运行到这里之前,事件循环是暂停的
  1. 同步执行debug("begin")
  2. 异步调用fs.readFile(),此时会开一个新的线程去进行异步I/O操作
  3. 异步调用setTimeout(),马上将超时信息压入到消息队列中
  4. 同步调用debug("end")
  5. 开启事件循环,弹出消息队列中的信息(目前是超时信息)
  6. 然后执行信息对应的回调函数(事件循环又被暂停)
  7. 回调函数执行结束后,开始事件循环(目前消息队列中没有任何东西,文件还没读完)
  8. 异步I/O读取文件完毕,将消息压入消息队列(消息中含有文件内容或者是出错信息)
  9. 事件循环取得消息,执行回调
  10. 程序退出。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
利用NodeJS和PhantomJS抓取网站页面信息以及网站截图
Nov 18 NodeJs
nodejs实现的一个简单聊天室功能分享
Dec 06 NodeJs
使用nodejs开发cli项目实例
Jun 03 NodeJs
nodejs的HTML分析利器node-jquery用法浅析
Nov 08 NodeJs
nodejs批量下载图片的实现方法
May 19 NodeJs
NodeJS自定义模块写法(详解)
Jun 27 NodeJs
Windows下快速搭建NodeJS本地服务器的步骤
Aug 09 NodeJs
详解使用vscode+es6写nodejs服务端调试配置
Sep 21 NodeJs
Nodejs调用WebService的示例代码
Sep 29 NodeJs
nodejs async异步常用函数总结(推荐)
Nov 17 NodeJs
nodejs的安装使用与npm的介绍
Sep 11 NodeJs
浅谈使用nodejs搭建web服务器的过程
Jul 20 NodeJs
浅析 NodeJs 的几种文件路径
Jun 07 #NodeJs
nodejs mysql 实现分页的方法
Jun 06 #NodeJs
nodejs利用ajax实现网页无刷新上传图片实例代码
Jun 06 #NodeJs
ajax +NodeJS 实现图片上传实例
Jun 06 #NodeJs
详解Nodejs之静态资源处理
Jun 05 #NodeJs
nodejs集成sqlite使用示例
Jun 05 #NodeJs
详解nodeJS之二进制buffer对象
Jun 03 #NodeJs
You might like
在 PHP 中使用随机数的三个步骤
2006/10/09 PHP
PHP similar_text 字符串的相似性比较函数
2010/05/26 PHP
ThinkPHP实现一键清除缓存方法
2014/06/26 PHP
CI框架中数据库操作函数$this->db->where()相关用法总结
2016/05/17 PHP
PHP实时统计中文字数和区别
2019/02/28 PHP
PHP数据对象映射模式实例分析
2019/03/29 PHP
picChange 图片切换特效的函数代码
2010/05/06 Javascript
js之ActiveX控件使用说明 new ActiveXObject()
2014/03/03 Javascript
深入理解JavaScript系列(46):代码复用模式(推荐篇)详解
2015/03/04 Javascript
jquery插件validation实现验证身份证号等
2015/06/04 Javascript
jQuery无刷新分页完整实例代码
2015/10/27 Javascript
使用jQuery mobile库检测url绝对地址和相对地址的方法
2015/12/04 Javascript
angularjs过滤器--filter与ng-repeat配合有奇效
2017/04/20 Javascript
深究AngularJS如何获取input的焦点(自定义指令)
2017/06/12 Javascript
vue+vue-validator 表单验证功能的实现代码
2017/11/13 Javascript
Vue2.5 结合 Element UI 之 Table 和 Pagination 组件实现分页功能
2018/01/26 Javascript
在 Typescript 中使用可被复用的 Vue Mixin功能
2018/04/17 Javascript
微信小程序wx.request的简单封装
2019/11/13 Javascript
[42:35]2018DOTA2亚洲邀请赛3月30日 小组赛A组 VG VS OpTic
2018/03/31 DOTA
Python3.2中的字符串函数学习总结
2015/04/23 Python
Python加pyGame实现的简单拼图游戏实例
2015/05/15 Python
python脚本内运行linux命令的方法
2015/07/02 Python
Python 爬虫多线程详解及实例代码
2016/10/08 Python
python实现决策树、随机森林的简单原理
2018/03/26 Python
详解Python3定时器任务代码
2019/09/23 Python
tensorflow中tf.slice和tf.gather切片函数的使用
2020/01/19 Python
浅析几个CSS3常用功能的写法
2014/06/05 HTML / CSS
结合CSS3的新特性来总结垂直居中的实现方法
2016/05/30 HTML / CSS
Casadei卡萨蒂官网:意大利奢侈鞋履品牌
2017/10/28 全球购物
审计专业自荐信范文
2014/04/21 职场文书
产品质量保证书
2014/04/29 职场文书
办公室主任岗位承诺书
2014/05/29 职场文书
个人剖析材料及整改措施
2014/10/07 职场文书
财政局党的群众路线教育实践活动剖析材料
2014/10/13 职场文书
我们的节日端午节活动总结
2015/02/11 职场文书
2016年元旦寄语
2015/08/17 职场文书