详解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的前后端分离的思考与实践(一)全栈式开发
Sep 26 NodeJs
Nodejs学习笔记之测试驱动
Apr 16 NodeJs
NodeJs读取JSON文件格式化时的注意事项
Sep 25 NodeJs
nodejs实现发出蜂鸣声音(系统报警声)的方法
Jan 18 NodeJs
NodeJS实现微信公众号关注后自动回复功能
May 31 NodeJs
nodejs 搭建简易服务器的图文教程(推荐)
Jul 18 NodeJs
nodejs中密码加密处理操作详解
Mar 20 NodeJs
nodejs 简单实现动态html的方法
May 12 NodeJs
NodeJs 实现简单WebSocket即时通讯的示例代码
Aug 05 NodeJs
nodejs实现聊天机器人功能
Sep 19 NodeJs
nodejs dgram模块广播+组播的实现示例
Nov 04 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
使用MaxMind 根据IP地址对访问者定位
2006/10/09 PHP
解析PHP中数组元素升序、降序以及重新排序的函数
2013/06/20 PHP
php中调用其他系统http接口的方法说明
2014/02/28 PHP
Javascript常用运算符(Operators)-javascript基础教程
2007/12/14 Javascript
33种Javascript 表格排序控件收集
2009/12/03 Javascript
js 自定义的联动下拉框
2010/02/07 Javascript
Jquery增加鼠标中间功能mousewheel的实例代码
2013/09/05 Javascript
JS获取当前日期时间并定时刷新示例
2021/03/04 Javascript
js面向对象编程之如何实现方法重载
2014/07/02 Javascript
JavaScript的原型继承详解
2015/02/15 Javascript
AngularJS的一些基本样式初窥
2015/07/27 Javascript
jquery日历插件datepicker用法分析
2016/01/22 Javascript
javascript求日期差的方法
2016/03/02 Javascript
JavaScript知识点总结(十)之this关键字
2016/05/31 Javascript
带有定位当前位置的百度地图前端web api实例代码
2016/06/21 Javascript
JS实现移动端在线签协议功能
2019/08/22 Javascript
在vue中嵌入外部网站的实现
2020/11/13 Javascript
python使用正则表达式分析网页中的图片并进行替换的方法
2015/03/26 Python
python Pygame的具体使用讲解
2017/11/03 Python
python通过opencv实现批量剪切图片
2017/11/13 Python
python奇偶行分开存储实现代码
2018/03/19 Python
python画蝴蝶曲线图的实例
2019/11/21 Python
Python PyInstaller库基本使用方法分析
2019/12/12 Python
django配置app中的静态文件步骤
2020/03/27 Python
matplotlib基础绘图命令之bar的使用方法
2020/08/13 Python
python定时截屏实现
2020/11/02 Python
HTML5 Canvas画线技巧——实现绘制一个像素宽的细线
2013/08/02 HTML / CSS
MADE荷兰:提供原创设计师家具
2018/04/03 全球购物
POS解决方案:MUNBYN(热敏打印机、条形码扫描仪)
2020/06/09 全球购物
使用C#编写创建一个线程的代码
2013/01/22 面试题
致400米运动员广播稿
2014/02/07 职场文书
创新社会管理心得体会
2014/09/12 职场文书
公司租房协议书范本
2014/10/08 职场文书
李强为自己工作观后感
2015/06/11 职场文书
Mysql中存储引擎的区别及比较
2021/06/04 MySQL
mysql通过group by分组取最大时间对应数据的两种有效方法
2022/09/23 MySQL