详解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 实现模拟form表单上传文件
Jul 14 NodeJs
NodeJS Web应用监听sock文件实例
Feb 18 NodeJs
nodejs简单实现中英文翻译
May 04 NodeJs
nodejs实现遍历文件夹并统计文件大小
May 28 NodeJs
NodeJS实现阿里大鱼短信通知发送
Jan 17 NodeJs
详解nodejs 文本操作模块-fs模块(三)
Dec 22 NodeJs
详解nodeJS中读写文件方法的区别
Mar 06 NodeJs
win系统下nodejs环境安装配置
May 04 NodeJs
NodeJS创建最简单的HTTP服务器
May 15 NodeJs
详解nodeJS之二进制buffer对象
Jun 03 NodeJs
nodejs实现套接字服务功能详解
Jun 21 NodeJs
Nodejs实现微信分账的示例代码
Jan 19 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
第一节--面向对象编程
2006/11/16 PHP
DEDE采集大师官方留后门的删除办法
2011/01/08 PHP
PHP操作数组的一些函数整理介绍
2011/07/17 PHP
Json_decode 解析json字符串为NULL的解决方法(必看)
2017/02/17 PHP
PHP和MYSQL实现分页导航思路详解
2017/04/11 PHP
Web版彷 Visual Studio 2003 颜色选择器
2007/01/09 Javascript
EXTJS记事本 当CompositeField遇上RowEditor
2011/07/31 Javascript
jQuery实现径向动画菜单效果
2015/07/17 Javascript
angularjs学习笔记之三大模块(modal,controller,view)
2015/09/26 Javascript
jquery mobile 实现自定义confirm确认框效果的简单实例
2016/06/17 Javascript
js的OOP继承实现(必看篇)
2017/02/18 Javascript
jQuery的三种bind/One/Live/On事件绑定使用方法
2017/02/23 Javascript
使用Electron构建React+Webpack桌面应用的方法
2017/12/15 Javascript
javascript高仿热血传奇游戏实现代码
2018/02/22 Javascript
Vue项目报错:Uncaught SyntaxError: Unexpected token
2018/11/10 Javascript
nodejs使用node-xlsx生成excel的方法示例
2019/08/22 NodeJs
JS中this的4种绑定规则详解
2020/02/04 Javascript
[01:45]绝对公平!DOTA2队长征召模式详解
2014/04/25 DOTA
Python __setattr__、 __getattr__、 __delattr__、__call__用法示例
2015/03/06 Python
python 读取文本文件的行数据,文件.splitlines()的方法
2018/07/12 Python
python使用tcp实现局域网内文件传输
2020/03/20 Python
利用matplotlib实现根据实时数据动态更新图形
2019/12/13 Python
python实现在内存中读写str和二进制数据代码
2020/04/24 Python
Python持续监听文件变化代码实例
2020/07/22 Python
Canvas在超级玛丽游戏中的应用详解
2021/02/06 HTML / CSS
台湾乐天市场:日本No.1的网路购物网站
2017/03/22 全球购物
直接有效的自我评价
2014/01/11 职场文书
家长给小学生的评语
2014/01/30 职场文书
职工代表大会主持词
2014/04/01 职场文书
教师产假请假条
2014/04/10 职场文书
小学生期末评语大全
2014/04/21 职场文书
李强为自己工作观后感
2015/06/11 职场文书
Django项目配置Memcached和Redis, 缓存选择哪个更有优势
2021/04/06 Python
如何使用Python对NetCDF数据做空间相关分析
2021/04/21 Python
Mysql忘记密码解决方法
2022/02/12 MySQL
Win11开始菜单添加休眠选项
2022/04/19 数码科技