Node的特点
1、异步I/O
例如,在Node中读取文件,与前端的Ajax调用方式非常类似:
var fs = require('fs');
fs.readFile('/path', function (err, file) { c
onsole.log('读取文件完成')
});
console.log('发起读取文件');
2、事件与回调函数
在JS中,函数是一等公民,回调函数无处不在。回调函数是Node中最好的接受异步调用返回数据的方式。
下面这个栗子,展示的是Ajax异步提交的服务器端处理过程。
var http = require('http');
var querystring = require('querystring');
//侦听服务器的request事件
http.createServer(function (req, res) {
var postData = '';
req.setEncoding('utf8');
//侦听请求的data事件
req.on('data', function (trunk) {
postData += trunk;
});
//侦听请求的end事件
req.on('end', function () {
res.end(postData);
});
}).listen(8080);
console.log('服务器启动完成');
3、单线程
Node保持了单线程的特点。单线程最大的好处是不用像多线程那样处处在意状态同步的问题,没有死锁问题,也没有线程上下文交换所带来的性能上的开销。
但是,单线程也有弱点:
1. 无法利用多核CPU
2. 错误会引起整个应用退出,因此应用的健壮性值得考验
3. 大量计算占用CPU导致无法继续调用异步I/O
积极面对这些弱点,可以避免潜在的问题,使其得以更高效的利用。
对于第三条的解决方案:
HTML5定制了Web Workers的标准,它能够创建工作线程来进行计算,以解决JS大计算阻塞UI渲染的问题。工作线程为了不阻塞住线程,通过消息传递的方式来传递运行结果,这也使得工作线程不能访问到主线程的UI。
Node使用了与WebWorkers相同的思路来解决单线程中大计算量的问题:child_process
子进程的出现,意味着Node可以从容的应对单线程在健壮性和无法利用多核CPU方面的问题。通过将计算分发到各个子进程,可以将大量的计算分解掉,然后再通过进程之间的消息来传递结果,这可以很好的保持应用模型的简单和低依赖。通过Master-Worker的管理方式,也可以很好的管理各个工作进程,以达到更高的健壮性。
4、跨平台
Node的应用场景
1、I/O密集
2、CPU密集
3、和遗留的系统和平共处
4、分布式应用