详解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 相关文章推荐
golang、python、php、c++、c、java、Nodejs性能对比
Mar 12 NodeJs
Nodejs异步回调的优雅处理方法
Sep 25 NodeJs
NodeJS制作爬虫全过程(续)
Dec 22 NodeJs
Nodejs中session的简单使用及通过session实现身份验证的方法
Feb 04 NodeJs
Nodejs进阶:基于express+multer的文件上传实例
Nov 21 NodeJs
nodejs开发——express路由与中间件
Mar 24 NodeJs
Windows下使用Nodejs运行js的方法
Sep 02 NodeJs
nodejs 最新版安装npm 的使用详解
Jan 18 NodeJs
nodejs中Express与Koa2对比分析
Feb 06 NodeJs
Nodejs使用Mongodb存储与提供后端CRD服务详解
Sep 04 NodeJs
NodeJs crypto加密制作token的实现代码
Nov 15 NodeJs
node快速搭建后台的实现步骤
Feb 18 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 DataGrid 实现代码
2009/08/12 PHP
PHP 网络开发详解之远程文件包含漏洞
2010/04/25 PHP
php 广告调用类代码(支持Flash调用)
2011/08/11 PHP
destoon实现调用自增数字从1开始的方法
2014/08/21 PHP
php中的mongodb select常用操作代码示例
2014/09/06 PHP
php自定义分页类完整实例
2015/12/25 PHP
jquery ajax 同步异步的执行 return值不能取得的解决方案
2012/01/08 Javascript
利用js实现禁止复制文本信息
2015/06/03 Javascript
javascript获取网页宽高方法汇总
2015/07/19 Javascript
简单的js表格操作
2016/09/24 Javascript
前端编码规范(3)JavaScript 开发规范
2017/01/21 Javascript
巧用weui.topTips验证数据的实例
2017/04/17 Javascript
vue项目添加多页面配置的步骤详解
2019/05/22 Javascript
20道JS原理题助你面试一臂之力(必看)
2019/07/22 Javascript
js实现简单的日历显示效果函数示例
2019/11/25 Javascript
JavaScript实现左右滚动电影画布
2020/02/06 Javascript
vue 添加和编辑用同一个表单,el-form表单提交后清空表单数据操作
2020/08/03 Javascript
Python入门篇之字符串
2014/10/17 Python
python实现字符串连接的三种方法及其效率、适用场景详解
2017/01/13 Python
python中urllib.unquote乱码的原因与解决方法
2017/04/24 Python
Python实现压缩和解压缩ZIP文件的方法分析
2017/09/28 Python
python中使用iterrows()对dataframe进行遍历的实例
2018/06/09 Python
Python使用pandas处理CSV文件的实例讲解
2018/06/22 Python
Python爬虫爬取Bilibili弹幕过程解析
2019/10/10 Python
Matplotlib中%matplotlib inline如何使用
2020/07/28 Python
Python3爬虫关于识别点触点选验证码的实例讲解
2020/07/30 Python
Easy Spirit官网:美国休闲鞋履中的代表品牌
2019/04/12 全球购物
可以使用抽象函数重写基类中的虚函数吗
2013/06/02 面试题
网游商务专员求职信
2013/10/15 职场文书
父亲追悼会答谢词
2014/01/17 职场文书
企业挂职心得体会
2014/09/10 职场文书
2016年优秀党务工作者先进事迹材料
2016/02/29 职场文书
go设置多个GOPATH的方式
2021/05/05 Golang
JavaWeb Servlet开发注册页面实例
2022/04/11 Java/Android
利用Python脚本写端口扫描器socket,python-nmap
2022/07/23 Python
Win11远程连接不上怎么办?Win11远程桌面用不了的解决方法
2022/08/05 数码科技