详解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 win7下安装方法
May 24 NodeJs
跟我学Nodejs(一)--- Node.js简介及安装开发环境
May 20 NodeJs
如何正确使用Nodejs 的 c++ module 链接到 OpenSSL
Aug 03 NodeJs
Nodejs中session的简单使用及通过session实现身份验证的方法
Feb 04 NodeJs
利用nodejs监控文件变化并使用sftp上传到服务器
Feb 18 NodeJs
nodejs实现爬取网站图片功能
Dec 14 NodeJs
nodejs基于WS模块实现WebSocket聊天功能的方法
Jan 12 NodeJs
nodejs实现的简单web服务器功能示例
Mar 15 NodeJs
nodejs用gulp管理前端文件方法
Jun 24 NodeJs
Nodejs监听日志文件的变化的过程解析
Aug 04 NodeJs
分享五个Node.js开发的优秀实践 
Apr 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对mongodb的扩展(初出茅庐)
2012/11/11 PHP
JavaScript Perfection kill 测试及答案
2010/03/23 Javascript
Jquery uploadify图片上传插件无法上传的解决方法
2013/12/16 Javascript
轻松创建nodejs服务器(7):阻塞操作的实现
2014/12/18 NodeJs
BootStrap 下拉菜单点击之后不会出现下拉菜单(下拉菜单不弹出)的解决方案
2016/12/14 Javascript
原生js实现倒计时功能(多种格式调用)
2017/01/12 Javascript
js实现带简单弹性运动的导航条
2017/02/22 Javascript
vue.js选中动态绑定的radio的指定项
2017/06/02 Javascript
vue 取出v-for循环中的index值实例
2019/11/09 Javascript
基于better-scroll 实现歌词联动功能的代码
2020/05/07 Javascript
vue+axios 拦截器实现统一token的案例
2020/09/11 Javascript
nuxt.js写项目时增加错误提示页面操作
2020/11/05 Javascript
详解Python中内置的NotImplemented类型的用法
2015/03/31 Python
Python实现简单的文件传输与MySQL备份的脚本分享
2016/01/03 Python
使用Python的Django框架结合jQuery实现AJAX购物车页面
2016/04/11 Python
Python中对象迭代与反迭代的技巧总结
2016/09/17 Python
Python+OpenCV 实现图片无损旋转90°且无黑边
2019/12/12 Python
在tensorflow中设置保存checkpoint的最大数量实例
2020/01/21 Python
ipython jupyter notebook中显示图像和数学公式实例
2020/04/15 Python
keras 简单 lstm实例(基于one-hot编码)
2020/07/02 Python
opencv 图像滤波(均值,方框,高斯,中值)
2020/07/08 Python
vscode配置anaconda3的方法步骤
2020/08/08 Python
使用anaconda安装pytorch的实现步骤
2020/09/03 Python
Canvas制作的下雨动画的示例
2018/03/06 HTML / CSS
李宁官方网店:中国运动品牌
2017/11/02 全球购物
Booking.com西班牙:全球酒店预订
2018/03/30 全球购物
化学教师教学反思
2014/01/17 职场文书
《雨霖铃》教学反思
2014/02/22 职场文书
《水乡歌》教学反思
2014/04/24 职场文书
小学语文教学经验交流材料
2014/06/02 职场文书
学生检讨书范文
2015/01/27 职场文书
生死牛玉儒观后感
2015/06/11 职场文书
增值税发票丢失证明
2015/06/19 职场文书
大学生心理健康教育心得体会
2016/01/12 职场文书
小学三年级作文之写景
2019/11/05 职场文书
JS实现九宫格拼图游戏
2022/06/28 Javascript