不要为失去的东西而忧伤,要对拥有它的时光心存感激~
各位宝宝,最近好吗?你那里降温了吗?北京已经降温了,各位要穿的厚厚的哦,好好照顾自己。
Node的特点
1.异步I/O
例如读取文件:
var fs = require('fs');fs.readFile('/path', function (err, file) { console.log('读取文件完成')}); console.log('发起读取文件');
在Node中,绝大多数的操作都是以异步的方式进行调用。这样的意义在于,在
Node中,我们可以从语言层面很自然的进行并行I/O操作。在每个调用之间无须等待之前的I/O调用结束。
fs.readFile('/path1',function(err, file){ console.log('读取文件1完成')})fs.readFile('/path2',function(err,file){ console.log('读取文件2完成')})
对于同步I/O而言,它们的耗时是两个任务的耗时之和。这里的异步带来的优势是显而易见的。
2.事件与回调函数
事件的编程方式具有轻量级、松耦合、只关注事物点等优势。但是在多个异步任务的场景下,事件与事件之间各自独立,如何协作是一个问题。
与其他的web后端语言相比,Node回调函数是一大特色。纵观下来,回调函数也是最好的接受异步调用返回数据的方式。
3.单线程
Node保持了JS在浏览器中单线程的特点。而且Node中,JS与其余线程是无法共享任何状态的。单线程的最大好处是不用像多线程那样处处在意状态的同步问题,这里没有死锁的村子,也没有线程上下文交换所带来的性能上的开销。单线程缺点:
-无法利用多核CPU
-错误会引起整个应用退出,应用的健壮性值的考验
-大量计算占用CPU导致无法继续调用异步I/O
像浏览器中JS与UI共用一个线程一样,JS长时间执行会导致UI的渲染和响应被中断。在Node中,长时间的CPU占用也会导致后续的异步I/O发不出调用。已完成的异步I/O的回调函数也会得不到及时执行。
Node采用了与Web Workers相同的思路来解决单线程中大计算量的问题:child_process.
子进程的出现,意味着Node可以从容的应对单线程在健壮性和无法利用多核CPU方面的问题。通过计算分发给各个子进程,可以将大量计算分解掉,然后再通过进程之间的事件消息来传递消息,这可以很好的保持应用模型的简单和低依赖性。通过Master-worker的管理方式,可以很好地管理各个工作进程,已达到更高的健壮性。
4.跨平台
兼容windows和*nix平台主要得益于Node在架构层面的改动,它在操作系统与Node上层模块系统之间创建了一层平台层架构,即libuv。目前,libuv已经成为许多系统实现跨平台的基础组件。
愿我们有能力不向生活缴械投降---Lin