详解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 相关文章推荐
使用upstart把nodejs应用封装为系统服务实例
Jun 01 NodeJs
Nodejs为什么选择javascript为载体语言
Jan 13 NodeJs
nodejs中实现阻塞实例
Mar 24 NodeJs
Nodejs学习笔记之测试驱动
Apr 16 NodeJs
nodejs的压缩文件模块archiver用法示例
Jan 18 NodeJs
nodejs中模块定义实例详解
Mar 18 NodeJs
nodejs个人博客开发第五步 分配数据
Apr 12 NodeJs
nodejs利用ajax实现网页无刷新上传图片实例代码
Jun 06 NodeJs
nodejs 子进程正确的打开方式
Jul 03 NodeJs
nodejs 搭建简易服务器的图文教程(推荐)
Jul 18 NodeJs
Nodejs libuv运行原理详解
Aug 21 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
星际争霸 Starcraft 游戏介绍
2020/03/14 星际争霸
DOTA2游戏同人动画《龙之血》导演接受采访
2021/03/05 欧美动漫
基于Zookeeper的使用详解
2013/05/02 PHP
PHP数组与对象之间使用递归实现转换的方法
2015/06/24 PHP
深入理解PHP原理之执行周期分析
2016/06/01 PHP
Thinkphp事务操作实例(推荐)
2017/04/01 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
2017/11/10 PHP
laravel 验证错误信息到 blade模板的方法
2019/09/29 PHP
php swoft框架实例用法
2020/12/22 PHP
JavaScript的parseInt 取整使用
2011/05/09 Javascript
jquery获得keycode的示例代码
2013/12/30 Javascript
jquery实现个人中心导航菜单效果和美观都非常不错
2014/09/02 Javascript
基于javascript实现单选及多选的向右和向左移动实例
2015/07/25 Javascript
使用jquery获取url及url参数的简单实例
2016/06/14 Javascript
node.js express安装及示例网站搭建方法(分享)
2016/08/22 Javascript
jQuery UI插件实现百度提词器效果
2016/11/21 Javascript
使用vue.js实现checkbox的全选和多个的删除功能
2017/02/17 Javascript
js评分组件使用详解
2017/06/06 Javascript
AngularJS实现的省市二级联动功能示例【可对选项实现增删】
2017/10/26 Javascript
如何制作一个Node命令行图像识别工具
2018/12/12 Javascript
适合前端Vue开发童鞋的跨平台Weex的使用详解
2019/10/16 Javascript
[02:41]DOTA2英雄基础教程 冥魂大帝
2014/01/16 DOTA
Python新手在作用域方面经常容易碰到的问题
2015/04/03 Python
Python 多个图同时在不同窗口显示的实现方法
2019/07/07 Python
django商品分类及商品数据建模实例详解
2020/01/03 Python
Pytorch 实现focal_loss 多类别和二分类示例
2020/01/14 Python
Python class的继承方法代码实例
2020/02/14 Python
使用python实现多维数据降维操作
2020/02/24 Python
pandas使用之宽表变窄表的实现
2020/04/12 Python
python 合并多个excel中同名的sheet
2021/01/22 Python
美工的岗位职责
2013/11/14 职场文书
八年级英语教学反思
2014/01/09 职场文书
4s店市场专员岗位职责
2014/04/09 职场文书
热爱祖国的演讲稿
2014/05/04 职场文书
房地产推广策划方案
2014/05/19 职场文书
给老婆的道歉信
2015/01/20 职场文书