详解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 相关文章推荐
Google官方支持的NodeJS访问API,提供后台登录授权
Jul 29 NodeJs
NodeJS制作爬虫全过程
Dec 22 NodeJs
nodejs中使用多线程编程的方法实例
Mar 24 NodeJs
nodejs微信公众号支付开发
Sep 19 NodeJs
NodeJS整合银联网关支付(DEMO)
Nov 09 NodeJs
NodeJS中的MongoDB快速入门详细教程
Nov 11 NodeJs
详解nodejs 文本操作模块-fs模块(五)
Dec 23 NodeJs
nodejs个人博客开发第三步 载入页面
Apr 12 NodeJs
nodejs 子进程正确的打开方式
Jul 03 NodeJs
NodeJs 文件系统操作模块fs使用方法详解
Nov 26 NodeJs
nodejs实现用户登录路由功能
May 22 NodeJs
详解利用nodejs对本地json文件进行增删改查
Sep 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编程实现简单的网页版计算器功能示例
2017/04/26 PHP
jquery遍历input取得input的name
2009/04/27 Javascript
JQuery 学习笔记 选择器之一
2009/07/23 Javascript
一个基于jquery的文本框记数器
2012/09/19 Javascript
jquery.post用法示例代码
2014/01/03 Javascript
JQuery1.8 判断元素是否绑定事件的方法
2014/07/10 Javascript
node.js中的http.request方法使用说明
2014/12/14 Javascript
JS获得选取checkbox整行数据的方法
2015/01/28 Javascript
JQuery移动页面开发之屏幕方向改变与滚屏的实现
2015/12/03 Javascript
Vue cli+mui 区域滚动的实例代码
2018/01/25 Javascript
vue 微信授权登录解决方案
2018/04/10 Javascript
vue-cli的工程模板与构建工具详解
2018/09/27 Javascript
功能完善的小程序日历组件的实现
2020/03/31 Javascript
逐行分析鸿蒙系统的 JavaScript 框架(推荐)
2020/09/17 Javascript
基于element-ui封装表单金额输入框的方法示例
2021/01/06 Javascript
Python中为feedparser设置超时时间避免堵塞
2014/09/28 Python
用python 制作图片转pdf工具
2015/01/30 Python
Python表示矩阵的方法分析
2017/05/26 Python
python实现Adapter模式实例代码
2018/02/09 Python
python 将字符串转换成字典dict的各种方式总结
2018/03/23 Python
对python的bytes类型数据split分割切片方法
2018/12/04 Python
浅谈python函数调用返回两个或多个变量的方法
2019/01/23 Python
Python 列表的清空方式
2020/01/13 Python
手把手教你实现一个canvas智绘画板的方法
2019/03/04 HTML / CSS
Gap工厂店:Gap Factory
2017/11/02 全球购物
英国最大的滑板品牌选择:Route One
2019/09/22 全球购物
购买原创艺术品:Zatista
2019/11/09 全球购物
C#如何判断当前用户是否输入某个域
2015/12/07 面试题
高中毕业自我鉴定
2013/12/19 职场文书
2014年庆祝国庆65周年演讲稿
2014/09/21 职场文书
商业计划书格式、范文
2019/03/21 职场文书
什么是检讨书?检讨书的格式及范文
2019/11/05 职场文书
python 自动刷新网页的两种方法
2021/04/20 Python
关于Javascript闭包与应用的详解
2021/04/22 Javascript
python分分钟绘制精美地图海报
2022/02/15 Python
在vue中import()语法不能传入变量的问题及解决
2022/04/01 Vue.js