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 文本操作模块-fs模块(二)
Dec 22 NodeJs
详解nodejs 文本操作模块-fs模块(三)
Dec 22 NodeJs
nodejs+express实现文件上传下载管理网站
Mar 15 NodeJs
nodejs使用express创建一个简单web应用
Mar 31 NodeJs
详解nodejs爬虫程序解决gbk等中文编码问题
Apr 06 NodeJs
nodejs连接mysql数据库简单封装示例-mysql模块
Apr 10 NodeJs
详解使用nodeJs安装Vue-cli
May 17 NodeJs
Nodejs搭建wss服务器教程
May 24 NodeJs
nodejs构建本地web测试服务器 如何解决访问静态资源问题
Jul 14 NodeJs
nodejs实现简单的gulp打包
Dec 21 NodeJs
nodejs中函数的调用实例详解
Oct 31 NodeJs
详解NodeJs项目 CentOs linux服务器线上部署
Sep 16 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 分库分表hash算法
2009/11/12 PHP
PHP中__get()和__set()的用法实例详解
2013/06/04 PHP
php去除头尾空格的2种方法
2015/03/16 PHP
浅析PHP开发规范
2018/02/05 PHP
PHP登录验证功能示例【用户名、密码、验证码、数据库、已登陆验证、自动登录和注销登录等】
2019/02/25 PHP
jquery validator 插件增加日期比较方法
2010/02/21 Javascript
jQuery的12招常用技巧分享
2011/08/08 Javascript
在JavaScript里嵌入大量字符串常量的实现方法
2013/07/07 Javascript
javascript中match函数的用法小结
2014/02/08 Javascript
Javascript核心读书有感之语言核心
2015/02/01 Javascript
详解JavaScript对象和数组
2015/12/03 Javascript
javascript从定义到执行 你不知道的那些事
2016/01/04 Javascript
JavaScript实现实时更新系统时间的实例代码
2017/04/04 Javascript
判断颜色是否合法的正则表达式(详解)
2017/05/03 Javascript
Node.js学习教程之Module模块
2019/09/03 Javascript
浅谈TypeScript 用 Webpack/ts-node 运行的配置记录
2019/10/11 Javascript
Django静态资源URL STATIC_ROOT的配置方法
2014/11/08 Python
基于Python的接口测试框架实例
2016/11/04 Python
Python 判断图像是否读取成功的方法
2019/01/26 Python
由Python编写的MySQL管理工具代码实例
2019/04/09 Python
Python实现最常见加密方式详解
2019/07/13 Python
基于Tensorflow:CPU性能分析
2020/02/10 Python
Python全面分析系统的时域特性和频率域特性
2020/02/26 Python
python属于解释型语言么
2020/06/15 Python
Django中F函数的使用示例代码详解
2020/07/06 Python
Python Opencv图像处理基本操作代码详解
2020/08/31 Python
html5文字阴影效果text-shadow使用示例
2013/07/25 HTML / CSS
英国百安居装饰建材网上超市:B&Q
2016/09/13 全球购物
深深扎根运动世界的生活品牌:Tillys
2017/10/30 全球购物
英国和世界各地预订便宜的酒店:LateRooms.com
2019/05/05 全球购物
如何配置、使用和清除Smarty缓存
2015/12/23 面试题
高中生学习生活的自我评价
2013/10/09 职场文书
天网工程实施方案
2014/03/26 职场文书
护理专科毕业自荐信范文
2014/04/21 职场文书
风之谷观后感
2015/06/11 职场文书
XX部保密工作制度范本
2019/08/27 职场文书