深入分析node.js的异步API和其局限性


Posted in Javascript onSeptember 05, 2016

用异步API的原因

异步的概念之所以首先在Web2.0中火起来,是因为在浏览器中Javascript在单线程上执行,而且他还与UI渲染公用一个线程.这意味着Javascript在执行的时候UI渲染和响应是处于停滞状态的.为了用户体验更好而采取异步的方式(当然,这在所谓的单线程语言中)不阻塞主线程继续响应用户操作.这属于用户体验的范畴.

同样的,如果有其他语言经验的工程师当然也明白,CPU在线程间切换是需要消耗大量的时间的(主要为上下文之间的切换和缓存),所以提高效率也是使用异步API的理由.

当然,这些并不是绝对的正确,只是人人都这么说而已.因为如果创建多线程的开销小于并行执行,那么多线程的方式是首选,这时常被认为是CPU密集型的处理任务.

总之,异步IO或者说异步API可以算作Node的特色,因为它是收个大规模将异步IO应用在应用层上的平台,它力求在单线程上将资源分配得更高效.

关于Promise

这里,本文并不打算详细讲解Promise的用法,只简单说明Promise的一些API和试用范围:

//结合nodejs的fs.readdir函数创建一个原生Promise
var promiseTask = new Promise(function(resolve,reject){ 
 fs.readdir('/var/www',function(err,files){
   if(!err){
    resolve(files);
   }else{ 
    reject(err);
   }
 });
});

promiseTask.then(function(files){ 
 console.log('内容为:'+files);
 return files; //为了接着演示其他API 这里return之后 可继续使用then定义下一步操作函数.
});
promiseTask.catch(function(err){ 
 console.log('报错为:'+err);
});

如何等待多个Promise完成?

//接上面
promiseTask.then(function(files){ 
 var readFilsePromiseList = files.map(function(file,index){
  return new Promise(function(resolve,reject){
   fs.readFile(file,'utf-8',function(err,str){
    if(!err){
     resolve(str)
    }
    else{
     reject(err)
    }
   });
  });
 });
 return Promise.all(readFilsePromiseList);
}).then(function(fileStrArray){
 console.log('所谓文件读取完毕:'+fileStrArray);
});

这段代码确实表现出了nodejs开发的优雅之处.

那么问题在哪?

目前再优雅的语言依然依托于操作系统,也就是说,系统的限制依然存在:

深入分析node.js的异步API和其局限性

我不知道能不能把这个错误解释成文件操作句柄耗尽,但大概意思本文希望各位能够理解,操作系统并不是可以同时打开无限多个文件.

还有这种:

深入分析node.js的异步API和其局限性

这个很好理解,内存耗尽. 当然,内存限制,可以通过加入以下两个运行参数调整:

node --max-old-space-size=8192 ./index.js #单位MB 
node --max-new-space-size=2048 ./index.js #单位KB

上述参数在V8初始化时生效,一旦生效不可动态变更.

很多人可能会提出,这两个限制在其他语言中一样存在.是的,其他语言一样存在.

但是其他语言强大的GC或多线程的编程模型可以让工程师们能在申请系统资源之后及时释放.

而nodejs中虽然也可手动释放不需要的系统资源,但真的可以做到引用程序里的每一个操作都能及时释放吗?

举个栗子:nodejs的redis包(npm install redis)并不提供同步的操作方法.

这意味着开发的过程要考虑更多的流程控制,很遗憾,单线程体系的nodejs并不擅长这个,正是因为本质上没有多线程的概念,没有锁机制,也不可能包含通常意义上的信号量机制,结果就是工程师根本不知道什么时候去手动释放资源.

除非对自己项目有绝对的掌控权,不使用任何使用异步API的第三方包.

所以,目前的结论就是,Promise只是一种开发的技巧,了解这些,并不适用于所有开发场景.

总结

以上就是关于node.js异步API和其局限性的全部内容,希望这篇文章对大家能有所帮助。如果有疑问大家可以留言交流。

Javascript 相关文章推荐
身份证号码前六位所代表的省,市,区, 以及地区编码下载
Apr 12 Javascript
List Installed Software Features
Jun 11 Javascript
Extjs学习过程中新手容易碰到的低级错误积累
Feb 11 Javascript
jquery选择符快速提取web表单数据示例
Mar 27 Javascript
javascript实现的简单的表单验证
Jul 10 Javascript
jQuery基于ajax实现星星评论代码
Aug 07 Javascript
js实现页面跳转的几种方法小结
May 16 Javascript
jQuery实现指定区域外单击关闭指定层的方法【经典】
Jun 22 Javascript
利用js编写网页进度条效果
Oct 08 Javascript
vue绑定的点击事件阻止冒泡的实例
Feb 08 Javascript
vue2 mint-ui loadmore实现下拉刷新,上拉更多功能
Mar 21 Javascript
小程序自定义日历效果
Dec 29 Javascript
点击页面任何位置隐藏div的实现方法
Sep 05 #Javascript
JS锚点的设置与使用方法
Sep 05 #Javascript
jquery基本选择器匹配多个元素的实现方法
Sep 05 #Javascript
Vue.js实现一个自定义分页组件vue-paginaiton
Sep 05 #Javascript
jquery层级选择器(匹配父元素下的子元素实现代码)
Sep 05 #Javascript
Vue.js每天必学之计算属性computed与$watch
Sep 05 #Javascript
jQuery实现的导航下拉菜单效果示例
Sep 05 #Javascript
You might like
给海燕B411配件机起死回生配上件
2021/03/02 无线电
php调整gif动画图片尺寸示例代码分享
2013/12/05 PHP
Zend Framework框架教程之Zend_Db_Table_Rowset用法实例分析
2016/03/21 PHP
PHP convert_uudecode()函数讲解
2019/02/14 PHP
PHP判断一个变量是否为整数、正整数的方法示例
2019/09/11 PHP
PhpStorm的使用教程(本地运行PHP+远程开发+快捷键)
2020/03/26 PHP
pjblog中的UBBCode.js
2007/04/25 Javascript
js模拟弹出效果代码修正版
2008/08/07 Javascript
批量实现面向对象的实例代码
2013/07/01 Javascript
jquery $.fn $.fx是什么意思有什么用
2013/11/04 Javascript
jquery.Ajax()方法调用Asp.Net后台的方法解析
2014/02/13 Javascript
js调用后台、后台调用前台等方法总结
2014/04/17 Javascript
iframe子页面与父页面在同域或不同域下的js通信
2014/05/07 Javascript
extjs 分页使用jsp传递数据示例
2014/07/29 Javascript
JavaScript中的对象序列化介绍
2014/12/30 Javascript
浅谈JavaScript中setInterval和setTimeout的使用问题
2015/08/01 Javascript
基于JavaScript实现自定义滚动条
2017/01/25 Javascript
微信小程序 支付功能开发错误总结
2017/02/21 Javascript
JS中实现浅拷贝和深拷贝的代码详解
2019/06/05 Javascript
layui动态加载多表头的实例
2019/09/05 Javascript
echarts实现晶体球面投影的实例教程
2020/10/10 Javascript
PyQt5 窗口切换与自定义对话框的实例
2019/06/20 Python
Python数学形态学实例分析
2019/09/06 Python
Python 字符串池化的前提
2020/07/03 Python
深入理解css属性的选择对动画性能的影响
2016/04/20 HTML / CSS
英国顶级珠宝品牌之家:John Greed
2018/06/09 全球购物
艺术设计专业个人求职信
2013/09/21 职场文书
班干部演讲稿
2014/04/24 职场文书
小学学雷锋活动总结
2014/04/25 职场文书
学习演讲稿范文
2014/05/10 职场文书
爱护公共设施的标语
2014/06/24 职场文书
2014乡镇干部对照检查材料思想汇报
2014/09/26 职场文书
先进事迹材料怎么写
2014/12/30 职场文书
自主招生自荐信格式范文
2015/03/25 职场文书
慰问信的写作格式及范文!
2019/06/24 职场文书
关于python中readlines函数的参数hint的相关知识总结
2021/06/24 Python