当前位置: 首页 > 后端技术 > Node.js

《Node.js初学》四题——阅读第一章《深入浅出Node》感慨

时间:2023-04-03 14:39:28 Node.js

1.为什么叫节点?它本身非常简单。它通过通信协议将众多的节点组织起来,非常容易扩展以达到构建大型网络应用的目的。每个Node进程构成了这个网络应用中的一个节点,这才是它名字的真正含义。2.能说说Node的特点吗?Node作为后端JavaScript的运行平台,保留了前端浏览器JavaScript中熟悉的接口,没有重写语言本身的任何特性,仍然基于作用域和原型链。不同的是,它将前端广泛使用的思想迁移到了服务端。结尾。下面我们来看一下node相对于其他语言的一些特点:1.异步I/O关于异步I/O,可能跟前端工程师比较容易解释,因为发起Ajax调用对于前端工程师来说是非常熟悉的场景。以下代码用于发起Ajax请求:$.post('/url',{title:'Node.js简介'},function(data){console.log('responsereceived');});console.log('Ajax发送结束');熟悉异步的用户一定知道,“receivedresponse”是在“endofsendingAjax”之后输出的。调用$.post()后,后面的代码立即执行,“receivedresponse”的执行时间是没有预料到的。我们只知道会在这个异步请求结束后执行,但不知道具体的时间点。异步调用中对结果值的捕获,符合“别叫我,我来叫你”的原则,也是一种注重结果,不关心过程的体现。2.事件和回调函数Node不像Rhino那样受Java影响很大。而是将前端浏览器中广泛使用和成熟的事件引入到后端,配合异步I/O将事件点暴露给业务逻辑。相比之下,事件通常用于前端和后端。对于其他语言,这种在JavaScript中随处可见的熟悉感,基本是不存在的。3、单线程Node在浏览器中保持了JavaScript的单线程特性。在Node中,JavaScript不能与其他线程共享任何状态。单线程最大的好处就是不需要像多线程编程那样关心状态同步问题。这里没有死锁,也没有线程上下文交换带来的性能开销。同样,单线程也有自己的弱点,这是在学习Node的过程中必须要面对的。通过积极面对这些弱点,您可以享受Node的好处并避免潜在的问题,从而可以高效地使用它。单线程的弱点具体有以下三个方面。?无法利用多核CPU。?一个错误会导致整个应用程序退出,应用程序的健壮性值得测试。?大量计算占用CPU,无法继续调用异步I/O。就像JavaScript和UI在浏览器中共享一个线程一样,JavaScript的长期执行会导致UI渲染和响应中断。在Node中,长时间的CPU占用也会导致后续的异步I/O调用失败,已经完成的异步I/O的回调函数不会被及时执行。3、上面提到单线程不利于计算,不能利用多核CPU。没有解决办法吗?一些。Node使用了和WebWorkers一样的思路来解决单线程大计算量的问题:child_process。子进程的出现,意味着Node可以从容应对单线程健壮性和无法利用多核CPU的问题。通过将计算分发到子流程,可以分解大量的计算,然后通过事件消息在流程之间传递结果,可以保持应用模型的简单性和低依赖性。4.能说说node的使用场景吗?关于Node,讨论最多的是I/O密集型和CPU密集型。I/O密集型在Node的推广过程中,人们无数次地问过Node的应用场景是什么。如果把所有的脚本语言都放在一个地方去评判,那么从单线程的角度来看,Node处理I/O的能力值得点赞。总的来说,说Node擅长I/O密集型应用场景,基本上是没有争议的。Node面向网络,擅长并行I/O,可以有效组织更多的硬件资源,提供更好的服务。I/O密集型的优点主要是Node利用了事件循环的处理能力,而不是每个请求都启动一个线程来服务,占用的资源非常少。CPU密集型从另一个角度来看,Node能否胜任CPU密集型应用场景?事实上,V8的执行效率是非常高的。单从执行效率来看,V8的执行效率是毋庸置疑的。CPU密集型应用给Node带来的主要挑战是:由于JavaScript是单线程的,如果有长时间运行的计算(比如大循环),CPU时间片不会被释放,以至于后续我/O无法启动。但通过将大型计算任务适当调整分解为多个小任务,可以及时释放计算,不会阻塞I/O调用的发起。这样就可以同时享受并行异步I/O带来的好处,充分利用CPU。CPU密集型并不可怕,如何合理调度才是诀窍。