使用异步应用编程接口的原因
异步的概念最初在Web2.0中流行的原因是,Javascript在浏览器中的单个线程上执行,并且它还与UI呈现共享一个线程。这意味着当执行Javascript时,UI呈现和响应处于停滞状态。为了更好的用户体验,采用异步(当然,这是在所谓的单线程语言中)不会阻止主线程继续响应用户操作。这属于用户体验的范畴。
同样,有过其他语言经验的工程师当然明白,CPU在线程之间切换(主要是在上下文和缓存之间切换)需要花费大量的时间,所以提高效率也是使用异步API的原因。
当然,这些都不是绝对正确的,但大家都这么说,因为如果创建多线程的成本小于并行执行,那么多线程就是首选,这往往被认为是CPU密集型的处理任务。
总之,异步IO或者异步API可以看作Node的特点,因为它是一个将异步IO大规模应用到应用层的平台,力求在单线程上更高效地分配资源。
关于承诺
这里,本文不打算详细解释Promise的用法,只简单说明Promise :的一些API和试用范围
//创建本机promise var promise task=new promise(函数(解析,拒绝){fs.readdir ('/var/www ',函数(err,files) {if(!err){ resolve(文件);} else { reject(err);} });});Promisetask.then(函数(文件){console.log('内容为: '文件);返回文件;//为了演示其他的API,可以在这里返回后继续使用then来定义下一个操作函数。});承诺任务。catch (function (err) {console。日志('错误为: ' err);});如何等待多个Promise完成?
//遵循承诺任务,然后(function(files){ var readfilseproxist=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);}).然后(function(filestray){ console . log('所谓的文件读取: ' fileStrArray});这段代码真正展示了nodejs开发的优雅。
那有什么问题呢?
目前,优雅的语言仍然依赖于操作系统,也就是说,系统的局限性仍然存在:
不知道能否把这个错误解释为文件操作句柄耗尽,但希望大家能明白,操作系统不能同时打开无限多的文件。
还有这个:
这很容易理解,记忆耗尽。当然,可以通过添加以下两个运行参数来调整内存限制
节点最大旧空间大小=8192。/index . js # Unit MB Node-max-new-space-size=2048。/index.js # Unit KB以上参数在V8初始化时生效,一旦生效就不能动态更改。
很多人可能会说这两个限制在其他语言中是一样的。是的,其他语言也一样。
但其他语言强大的GC或多线程编程模型,可以让工程师在申请后及时释放系统资源。
虽然nodejs中可以手动释放不必要的系统资源,但是参考程序中的每一个操作都可以及时释放吗?
比如板栗:nodejs的redis包(npm install redis)没有提供同步操作方法。
这意味着在开发过程中应该考虑更多的过程控制。遗憾的是,单线程系统的nodejs并不擅长这个,恰恰是因为没有多线程的概念,没有锁机制,也不可能包含通常意义上的信号量机制。结果,工程师根本不知道什么时候手动释放资源。
除非您对自己的项目有绝对的控制权,否则不要使用任何使用异步API的第三方包。
所以目前的结论是Promise只是一种开发技巧,并不适合所有的开发场景。
摘要
以上就是node.js异步API及其局限性。希望这篇文章对大家有所帮助。有问题可以留言交流。