nodejs教程之异步I/O


Posted in NodeJs onNovember 21, 2014

前言

在我映像中,异步最早出现与ajax,当时我还在搞.net,然后.net居然出了一个异步的控件......

虽然我最后知道了他不是异步的......然后,前端异步用得特别多,如果不是异步的程序,你都不好意思说是自己写的NodeJs是机遇javascript做出来的,

异步编程模型这一特点也被带了过来,异步有很多优点,但是对设计而言却是一个噩梦,异步会打乱时序,所以加大了设计困难,

但是异步对性能提升、对用户体验有了革命性的提高,所以NodeJS的 异步特性相当明显,今天我们就来简单学习

异步I/O

其实在操作系统层面上,只有两种I/O方式,堵塞和非堵塞

在堵塞模型中,应用程序需要等待I/O完成才返回结果,他的特点是调用后腰等待系统完成所有操作才行,这个会造成CPU的等待,而非堵塞调用后会马上返回

我初学是看的是一本书,但是这里感觉没有描述清楚,而且异步模型来说其实很大只是感受层面的提高,举一个简单的例子

我现在有一个搜索页和列表页两个单页应用的view,我搜索时候就是需要通过各种渠道搜索,深圳需要调用第三方,第三方再从具体渠道获取数据

这个时候当然很慢,我如果直接由A切入B在B在搞一个loading框什么的加载数据自然没有问题,但是现在问题是我A切换到B需要动画效果

这个就要求切换时候Bview渲染已经结束,至少不会再运到过程中获取数据开始渲染,所以此时异步可能就不那么好使,就是是异步请求数据,也是要数据获取才能加载页面

这个仍然是堵塞加载,这个在业务上是没有办法的

任何技术皆非完美,堵塞造成CPU等待浪费,非堵塞打乱逻辑不说可能还需要轮询以确认是否完成加载(曾经我使用轮询检测一个dom是否生成)

NodeJs采用的是事件循环机制,在进程启动时,Node会创建一个死循环,每执行一次循环体的过程就是一次Tick,每个Tick的过程就是才看是否有事件需要处理

如果有就取出事件相关,执行之,然后进入下一逻辑,没有就退出循环

每个Tick过程中,每个事件循环中有一个或者多个观察者,判断是否有事件要处理的过程就是向这些观察者询问是否需要处理这个事件

以我们html的事件模型为例

对html来说,其实他的每个DOM都是一个观察者,页面的DOM观察着我们的Web Page的变化,我们对一个DOM提供一个addEventListener后,便会对其注册一个回调函数,我们注册的事件会被放到一个“容器”对象中,这时只是注册,这些函数在满足条件后会被触发(页面变化时),相关的事件会从容器中取出执行

我们现在点击了一次页面上一个点,然后我们会由容器中取出click事件集合,我们会找到相关的dom,然后触发这些dom的回调函数

事件可能来自用户的点击或者数据变化,在Node中事件主要来自于网络请求,文件I/O,这些事件都会有对应的观察者,如文件观察者,网络观察者

这也是一个典型生产/消费模型,异步I/O ,网络请求提供事件生产,事件传递到各个观察者,观察者注册事件,事件循环负责取出事件然后执行事件

PS:以click为例,各个DOM观察者先注册事件,页面进程不停的监视页面,用户click页面生产事件,然后由容器中取出注册的click事件并执行,

一般的函数逻辑由我们控制:

 var forEach = function (list, callback) {

     for (var i = 0, len = list.length; i < len; i++) {

         callback(list[i], i, list);

     }

 }

异步的情况下回调函数不由开发者控制了,每次js发起调用会产生一个过渡产品请求对象

 fs.open = function (path, flags, mode, callback) {

   bingding.open(pathModule._makeLong(path), stringToFlags(flags), mode, callback);

 };

fs.open根据路径和参数打开一个文件,从而得到相关数据,内部调用了c++相关接口,过程中会产生一个中间对象,我们的所有状态会在其中......

PS:看了这么久,我感觉不太好

结语

以上就是关于nodejs中异步I/O的全部内容了,个人总结,如有遗漏或者错误,还请大家指出。

NodeJs 相关文章推荐
nodejs爬虫抓取数据之编码问题
Jul 03 NodeJs
nodejs初步体验篇
Nov 23 NodeJs
实例详解Nodejs 保存 payload 发送过来的文件
Jan 14 NodeJs
详解nodejs爬虫程序解决gbk等中文编码问题
Apr 06 NodeJs
详解nodejs微信公众号开发——5.素材管理接口
Apr 11 NodeJs
Nodejs 复制文件/文件夹的方法
Aug 24 NodeJs
浅谈NodeJs之数据库异常处理
Oct 25 NodeJs
Mac 安装 nodejs方法(图文详细步骤)
Oct 30 NodeJs
nodejs简单访问及操作mysql数据库的方法示例
Mar 15 NodeJs
nodejs连接mysql数据库及基本知识点详解
Mar 20 NodeJs
Nodejs使用archiver-zip-encrypted库加密压缩文件时报错(解决方案)
Nov 18 NodeJs
nodejs使用Sequelize框架操作数据库的实现
Oct 21 NodeJs
nodejs教程之入门
Nov 21 #NodeJs
nodejs 提示‘xxx’ 不是内部或外部命令解决方法
Nov 20 #NodeJs
nodejs开发环境配置与使用
Nov 17 #NodeJs
Nodejs全栈框架StrongLoop推荐
Nov 09 #NodeJs
初始Nodejs
Nov 08 #NodeJs
Nodejs极简入门教程(三):进程
Oct 27 #NodeJs
Nodejs极简入门教程(二):定时器
Oct 25 #NodeJs
You might like
非常不错的MySQL优化的8条经验
2008/03/24 PHP
PHP和.net中des加解密的实现方法
2013/02/27 PHP
php准确获取文件MIME类型的方法
2015/06/17 PHP
php简单创建zip压缩文件的方法
2016/04/30 PHP
PHP利用递归函数实现无限级分类的方法
2019/03/22 PHP
JS(jQuery)实现聊天接收到消息语言自动提醒功能详解【提示“您有新的消息请注意查收”】
2019/04/16 PHP
JS创建优美的页面滑动块效果 - Glider.js
2007/09/27 Javascript
jQuery下扩展插件和拓展函数的写法(匿名函数使用的典型例子)
2010/10/20 Javascript
JS操作JSON要领详细总结
2013/08/25 Javascript
JS字符串拼接在ie中都报错的解决方法
2014/03/27 Javascript
js计算德州扑克牌面值的方法
2015/03/04 Javascript
ubuntu下安装nodejs以及升级的办法
2015/05/08 NodeJs
JavaScript中setMonth()方法的使用详解
2015/06/11 Javascript
使用JQuery实现智能表单验证功能
2016/03/08 Javascript
BootStrap下拉框在firefox浏览器界面不友好的解决方案
2016/08/18 Javascript
AngularJS 与百度地图的结合实例
2016/10/20 Javascript
解析JavaScript实现DDoS攻击原理与保护措施
2016/12/26 Javascript
浅谈关于.vue文件中style的scoped属性
2017/08/19 Javascript
vue组件(全局,局部,动态加载组件)
2018/09/02 Javascript
JavaScript显式数据类型转换详解
2019/03/18 Javascript
从零开始学Python第八周:详解网络编程基础(socket)
2016/12/14 Python
Python利用operator模块实现对象的多级排序详解
2017/05/09 Python
解决python matplotlib imshow无法显示的问题
2018/05/24 Python
使用Python Pandas处理亿级数据的方法
2019/06/24 Python
python操作openpyxl导出Excel 设置单元格格式及合并处理代码实例
2019/08/27 Python
利用django model save方法对未更改的字段依然进行了保存
2020/03/28 Python
Python基于百度AI实现OCR文字识别
2020/04/02 Python
Python getsizeof()和getsize()区分详解
2020/11/20 Python
Python实现树莓派摄像头持续录像并传送到主机的步骤
2020/11/30 Python
请解释流与文件有什么不同
2016/07/29 面试题
生产管理的三大手法
2013/11/11 职场文书
中文教师求职信
2014/02/22 职场文书
公司年底活动方案
2014/08/17 职场文书
大三学年自我鉴定范文(3篇)
2014/09/28 职场文书
公司岗位说明书
2015/10/08 职场文书
社区服务理念口号
2015/12/25 职场文书