深入分析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 相关文章推荐
jQuery 表格插件整理
Apr 27 Javascript
jquery获取下拉列表的值为null的解决方法
Mar 18 Javascript
JavaScript之编码规范 推荐
May 23 Javascript
web 屏蔽BackSpace键实例代码
Dec 24 Javascript
vue.js中Vue-router 2.0基础实践教程
May 08 Javascript
使用vue-aplayer插件时出现的问题的解决
Mar 02 Javascript
webpack项目轻松混用css module的方法
Jun 12 Javascript
解决vue select当前value没有更新到vue对象属性的问题
Aug 30 Javascript
Vue-cli3简单使用(图文步骤)
Apr 30 Javascript
vue项目前端知识点整理【收藏】
May 13 Javascript
vue实现商城秒杀倒计时功能
Dec 12 Javascript
javascript实现贪吃蛇小游戏
Jul 28 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
php中使用接口实现工厂设计模式的代码
2012/06/17 PHP
Extjs优化(一)删除冗余代码提高运行速度
2013/04/15 Javascript
javascript中expression的用法整理
2014/05/13 Javascript
javascript中setTimeout和setInterval的unref()和ref()用法示例
2014/11/26 Javascript
JS实现的表格操作类详解(添加,删除,排序,上移,下移)
2015/12/22 Javascript
Node.js制作简单聊天室
2017/01/12 Javascript
原生js获取浏览器窗口及元素宽高常用方法集合
2017/01/18 Javascript
浅谈JavaScript正则表达式-非捕获性分组
2017/03/08 Javascript
JavaScript实现弹出广告功能
2017/03/30 Javascript
在node中如何使用 ES6
2017/04/22 Javascript
原生JS控制多个滚动条同步跟随滚动效果
2017/12/22 Javascript
vue2 mint-ui loadmore实现下拉刷新,上拉更多功能
2018/03/21 Javascript
vue+iview动态渲染表格详解
2019/03/19 Javascript
JavaScript中callee和caller的区别与用法实例分析
2019/06/28 Javascript
基于layPage插件实现两种分页方式浅析
2019/07/27 Javascript
JavaScript和TypeScript中的void的具体使用
2019/09/12 Javascript
在webstorm中配置less的方法详解
2020/09/25 Javascript
python编写暴力破解FTP密码小工具
2014/11/19 Python
Python实现视频下载功能
2017/03/14 Python
详解python eval函数的妙用
2017/11/16 Python
对PyQt5基本窗口控件 QMainWindow的使用详解
2019/06/19 Python
git查看、创建、删除、本地、远程分支方法详解
2020/02/18 Python
使用Python发现隐藏的wifi
2020/03/04 Python
英国Amara家居法国网站:家居装饰,现代装饰和豪华礼品
2016/12/15 全球购物
德国黑胶唱片、街头服装及运动鞋网上商店:HHV
2018/08/24 全球购物
生物化工专业个人自荐信
2013/09/26 职场文书
历史学专业个人的自我评价
2013/10/13 职场文书
播音主持专业个人自我评价
2014/01/09 职场文书
英语教师自荐信
2014/05/26 职场文书
2014大四本科生自我鉴定总结
2014/10/04 职场文书
群众路线批评与自我批评发言稿
2014/10/16 职场文书
2015年度公共机构节能工作总结
2015/05/26 职场文书
Python3 如何开启自带http服务
2021/05/18 Python
python如何正确使用yield
2021/05/21 Python
详解如何用Python实现感知器算法
2021/06/18 Python
SpringBoot连接MySQL获取数据写后端接口的操作方法
2021/11/02 MySQL