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批量修改文件编码格式
Jan 22 NodeJs
nodejs简单实现操作arduino
Sep 25 NodeJs
nodejs的压缩文件模块archiver用法示例
Jan 18 NodeJs
用nodejs搭建websocket服务器
Jan 23 NodeJs
nodeJs链接Mysql做增删改查的简单操作
Feb 04 NodeJs
nodejs根据ip数组在百度地图中进行定位
Mar 06 NodeJs
详解使用PM2管理nodejs进程
Oct 24 NodeJs
nodejs简单实现TCP服务器端和客户端的聊天功能示例
Jan 04 NodeJs
详解nodejs 开发企业微信第三方应用入门教程
Mar 12 NodeJs
nodeJs的安装与npm全局环境变量的配置详解
Jan 06 NodeJs
nodejs使用Sequelize框架操作数据库的实现
Oct 21 NodeJs
nodejs中内置模块fs,path常见的用法说明
Nov 07 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和javascript之间变量的传递实现代码
2012/12/19 PHP
PHP、Python和Javascript的装饰器模式对比
2015/02/03 PHP
CentOS下搭建PHP环境与WordPress博客程序的全流程总结
2016/05/07 PHP
PHP+Redis事务解决高并发下商品超卖问题(推荐)
2020/08/03 PHP
一段利用WSH修改和查看IP配置的代码
2008/05/11 Javascript
超酷的网页音乐播放器DewPlayer使用方法
2010/12/18 Javascript
jquery封装的对话框简单实现
2013/07/21 Javascript
JAVASCRIPT函数作用域和提前声明 分享
2013/08/22 Javascript
JS获取几种URL地址的方法小结
2014/02/26 Javascript
js去字符串前后空格的实现方法
2016/02/26 Javascript
浅析jQuery 遍历函数,javascript中的each遍历
2016/05/25 Javascript
实用又漂亮的BootstrapValidator表单验证插件
2016/05/30 Javascript
JavaScript 是什么意思
2016/09/22 Javascript
深入理解javascript中的 “this”
2017/01/17 Javascript
js实现图片旋转 js滚动鼠标中间对图片放大缩小
2017/07/05 Javascript
[54:02]2018DOTA2亚洲邀请赛 4.1 小组赛 B组 IG vs VGJ.T
2018/04/03 DOTA
利用python将json数据转换为csv格式的方法
2018/03/22 Python
在python中将字符串转为json对象并取值的方法
2018/12/31 Python
详解python函数的闭包问题(内部函数与外部函数详述)
2019/05/17 Python
ipython和python区别详解
2019/06/26 Python
PyQt5如何将.ui文件转换为.py文件的实例代码
2020/05/26 Python
HTML5之SVG 2D入门1—SVG(可缩放矢量图形)概述
2013/01/30 HTML / CSS
HelloFresh澳大利亚:订购你的美味食品盒、健康餐食
2018/03/28 全球购物
韩国保养品、日本药妆购物网:小三美日
2018/12/30 全球购物
英国现代市场:ARKET
2019/04/10 全球购物
荷兰最大的多品牌男装连锁店:Adam Brandstore
2019/12/31 全球购物
一道写SQL的面试题和答案
2013/11/19 面试题
Shell脚本如何向终端输出信息
2014/04/25 面试题
2015年收银工作总结范文
2015/04/01 职场文书
2015年幼儿园国庆节活动总结
2015/07/30 职场文书
2019年员工晋升管理制度范本!
2019/07/08 职场文书
Python爬虫之爬取最新更新的小说网站
2021/05/06 Python
MySQL删除和插入数据很慢的问题解决
2021/06/03 MySQL
Java日常练习题,每天进步一点点(38)
2021/07/26 Java/Android
教你如何让spark sql写mysql的时候支持update操作
2022/02/15 MySQL
详细介绍python操作RabbitMq
2022/04/12 Python