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访问ActiveX对象,以操作Access数据库为例。
Dec 15 NodeJs
nodejs中的fiber(纤程)库详解
Mar 24 NodeJs
angular2+nodejs实现图片上传功能
Mar 27 NodeJs
nodejs模块nodemailer基本使用-邮件发送示例(支持附件)
Mar 28 NodeJs
nodejs个人博客开发第二步 入口文件
Apr 12 NodeJs
nodejs构建本地web测试服务器 如何解决访问静态资源问题
Jul 14 NodeJs
基于nodejs的雪碧图制作工具的示例代码
Nov 05 NodeJs
NodeJs实现简单的爬虫功能案例分析
Dec 05 NodeJs
NodeJs入门教程之定时器和队列
Mar 08 NodeJs
Nodejs监控事件循环异常示例详解
Sep 22 NodeJs
nodejs+express最简易的连接数据库的方法
Dec 23 NodeJs
浅谈Node的内存泄露问题
May 06 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
PHP的博客ping服务代码
2012/02/04 PHP
php并发对MYSQL造成压力的解决方法
2013/02/21 PHP
php获取服务器操作系统相关信息的方法
2016/10/08 PHP
利用ajax和PHP实现简单的流程管理
2017/03/23 PHP
JavaScript 格式字符串的应用
2010/03/29 Javascript
jquery限定文本框只能输入数字即整数和小数
2013/11/29 Javascript
jQuery实现带分组数据的Table表头排序实例分析
2015/11/24 Javascript
详解JS正则replace的使用方法
2016/03/06 Javascript
JavaScript实现垂直滚动条效果
2017/01/18 Javascript
前端构建工具之gulp的配置与搭建详解
2017/06/12 Javascript
js实现经典贪吃蛇小游戏
2020/03/19 Javascript
Vue组件为什么data必须是一个函数
2020/06/11 Javascript
解决vue与node模版引擎的渲染标记{{}}(双花括号)冲突问题
2020/09/11 Javascript
[56:41]iG vs Winstrike 2018国际邀请赛小组赛BO2 第二场
2018/08/17 DOTA
python多重继承新算法C3介绍
2014/09/28 Python
对于Python装饰器使用的一些建议
2015/06/03 Python
Python中操作符重载用法分析
2016/04/29 Python
python3制作捧腹网段子页爬虫
2017/02/12 Python
python实现比较文件内容异同
2018/06/22 Python
将pandas.dataframe的数据写入到文件中的方法
2018/12/07 Python
python自动发微信监控报警
2019/09/06 Python
如何使用Python多线程测试并发漏洞
2019/12/18 Python
Python基于类路径字符串获取静态属性
2020/03/12 Python
浅谈keras2 predict和fit_generator的坑
2020/06/17 Python
Python操作PostgreSql数据库的方法(基本的增删改查)
2020/12/29 Python
html5小程序飞入购物车(抛物线绘制运动轨迹点)
2020/10/19 HTML / CSS
美体小铺奥地利官方网站:The Body Shop奥地利
2019/04/11 全球购物
IFCHIC台湾:欧美国际设计师品牌
2019/05/18 全球购物
我看到了用指针调用函数的不同语法形式
2014/07/16 面试题
简述数组与指针的区别
2014/01/02 面试题
会计应届生的自荐信
2013/12/13 职场文书
大二法学专业职业生涯规划范文
2014/02/12 职场文书
公司管理建议书范文
2014/03/12 职场文书
十八大宣传标语
2014/10/09 职场文书
Vertica集成Apache Hudi重磅使用指南
2022/03/31 Servers
Python实现自动玩连连看的脚本分享
2022/04/04 Python