详解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分页类代码分享
Jun 17 NodeJs
nodejs 整合kindEditor实现图片上传
Feb 03 NodeJs
nodejs实现bigpipe异步加载页面方案
Jan 26 NodeJs
深入nodejs中流(stream)的理解
Mar 27 NodeJs
nodejs之get/post请求的几种方式小结
Jul 26 NodeJs
Windows下快速搭建NodeJS本地服务器的步骤
Aug 09 NodeJs
NodeJS实现视频转码的示例代码
Nov 18 NodeJs
nodejs实现超简单生成二维码的方法
Mar 17 NodeJs
nodejs高大上的部署方式(PM2)
Sep 11 NodeJs
详解NodeJS Https HSM双向认证实现
Mar 12 NodeJs
nodejs中实现修改用户路由功能
May 24 NodeJs
Nodejs + sequelize 实现增删改查操作
Nov 07 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+xslt在windows平台上
2006/10/09 PHP
PHP+Ajax实现验证码的实时验证
2016/07/20 PHP
基于PHP的加载类操作以及其他两种魔术方法的应用实例
2017/08/28 PHP
juqery 学习之六 CSS--css、位置、宽高
2011/02/11 Javascript
javascript验证上传文件的类型限制必须为某些格式
2013/11/14 Javascript
可插入图片的TEXT文本框
2013/12/27 Javascript
js获取url中"?"后面的字串方法
2014/05/15 Javascript
JavaScript实现定时隐藏与显示图片的方法
2015/08/06 Javascript
jquery插件jquery.confirm弹出确认消息
2015/12/22 Javascript
js 获取范围内的随机数实例代码
2016/08/02 Javascript
js转换对象为xml
2017/02/17 Javascript
jQuery操作DOM_动力节点Java学院整理
2017/07/04 jQuery
简易Vue评论框架的实现(父组件的实现)
2018/01/08 Javascript
VUE+Element UI实现简单的表格行内编辑效果的示例的代码
2018/10/31 Javascript
vue项目中使用vue-i18n报错的解决方法
2019/01/13 Javascript
Vue2.0实现组件之间数据交互和通信操作示例
2019/05/16 Javascript
python读写ini配置文件方法实例分析
2015/06/30 Python
Python图形绘制操作之正弦曲线实现方法分析
2017/12/25 Python
python 基本数据类型占用内存空间大小的实例
2018/06/12 Python
详解Python3的TFTP文件传输
2018/06/26 Python
使用python中的in ,not in来检查元素是不是在列表中的方法
2018/07/06 Python
Python API自动化框架总结
2019/11/12 Python
Python 改变数组类型为uint8的实现
2020/04/09 Python
Django-migrate报错问题解决方案
2020/04/21 Python
使用keras实现densenet和Xception的模型融合
2020/05/23 Python
Groupon比利时官方网站:特卖和网上购物高达-70%
2019/08/09 全球购物
团员学习总结的自我评价范文
2013/10/14 职场文书
xxx同志考察材料
2014/02/07 职场文书
预备党员表决心书
2014/03/11 职场文书
市委常委班子党的群众路线教育实践活动整改措施
2014/10/02 职场文书
市场部岗位职责范本
2015/04/15 职场文书
2015年党建工作目标责任书
2015/05/08 职场文书
三严三实·严以修身心得体会
2016/01/15 职场文书
初一语文教学反思
2016/03/03 职场文书
gateway与spring-boot-starter-web冲突问题的解决
2021/07/16 Java/Android
Nginx如何配置根据路径转发详解
2022/07/23 Servers