深入分析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 相关文章推荐
JavaScript 存在陷阱 删除某一区域所有节点
May 10 Javascript
能说明你的Javascript技术很烂的五个原因分析
Oct 28 Javascript
javascript中数组中求最大值示例代码
Dec 18 Javascript
window.location.href中url中数据量太大时的解决方法
Dec 23 Javascript
js解析json读取List中的实体对象示例
Mar 11 Javascript
每天一篇javascript学习小结(String对象)
Nov 18 Javascript
jQuery实现鼠标跟随提示层效果代码(可显示文本,Div,Table,Html等)
Apr 18 Javascript
Angular.JS学习之依赖注入$injector详析
Oct 20 Javascript
基于js实现的限制文本框只可以输入数字
Dec 05 Javascript
canvas 弹幕效果(实例分享)
Jan 11 Javascript
简单谈谈js的数据类型
Sep 25 Javascript
js和jquery判断数据类型的4种方法总结
Aug 28 jQuery
点击页面任何位置隐藏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变量的方法
2015/06/26 PHP
浅析php-fpm静态和动态执行方式的比较
2016/11/09 PHP
PHP生成随机密码4种方法及性能对比
2020/12/11 PHP
jQuery EasyUI 中文API Button使用实例
2010/04/14 Javascript
基于jQuery的固定表格头部的代码(IE6,7,8测试通过)
2010/05/18 Javascript
JavaScript 获取当前时间戳的代码
2010/08/05 Javascript
jq实现酷炫的鼠标经过图片翻滚效果
2014/03/12 Javascript
javascript判断是否按回车键并解决浏览器之间的差异
2014/05/13 Javascript
vue制作加载更多功能的正确打开方式
2016/10/12 Javascript
前端面试知识点锦集(JavaScript篇)
2016/12/28 Javascript
原生node.js案例--前后台交互
2017/02/20 Javascript
最基础的vue.js双向绑定操作
2017/08/23 Javascript
Vue2.0+ElementUI实现表格翻页的实例
2017/10/23 Javascript
JS中获取 DOM 元素的绝对位置实例详解
2018/04/23 Javascript
微信小程序调用摄像头隐藏式拍照功能
2018/08/22 Javascript
利用Vue-draggable组件实现Vue项目中表格内容的拖拽排序
2019/06/07 Javascript
使用element-ui +Vue 解决 table 里包含表单验证的问题
2020/07/17 Javascript
解决Vue大括号字符换行踩的坑
2020/11/09 Javascript
详解使用Python处理文件目录的相关方法
2015/10/16 Python
详解常用查找数据结构及算法(Python实现)
2016/12/09 Python
Odoo中如何生成唯一不重复的序列号详解
2018/02/10 Python
Windows 7下Python Web环境搭建图文教程
2018/03/20 Python
python编写简单端口扫描器
2019/09/04 Python
Keras之自定义损失(loss)函数用法说明
2020/06/10 Python
使用Python将语音转换为文本的方法
2020/08/10 Python
使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二)
2020/10/12 Python
HTML5之HTML元素扩展(下)—增强的Form表单元素值得关注
2013/01/31 HTML / CSS
德国高性价比网上药店:medpex
2017/07/09 全球购物
受希腊女神灵感的晚礼服、鸡尾酒礼服和婚纱:THEIA
2018/04/15 全球购物
澳大利亚设计的优质鞋类和适合澳大利亚生活方式的服装:Rivers
2019/04/23 全球购物
PyQt 如何创建自定义QWidget
2021/03/24 Python
创业计划书六个要素
2013/12/26 职场文书
一年级学生评语
2014/04/23 职场文书
小学生感恩老师演讲稿
2014/08/28 职场文书
婚宴主持词
2015/06/30 职场文书
2016年政治理论学习心得体会
2016/01/25 职场文书