node是一个单线程、单进程的javascript运行环境。chrome浏览器与node的组成结构类似,浏览器通过事件驱动来服务界面上的交互,node通过事件驱动服务I/O,在node中,javascript可以访问本地文件,搭建websoket服务器,连接数据库,可以像web worker使用多进程。
放一张图
node特点
异步I/O
node中,文件读取和网络请求等都可以以异步的方式进行调用,每个调用之间无需等待之前的I/O调用结束
var fs = require('fs')
fs.readFile('/path1', function(err, file) {
console.log('文件1读取完成')
})
fs.readFile('/path2', function(err, file) {
console.log('文件2读取完成')
})
console.log('发起读取文件')
//每个调用之间无需d等待之前的I/O调用结束,先输出发起读取文件,操作耗时取决于最慢的读取文件的耗时
事件与回调函数
可以将函数作为对象传递给方法作为实参进行调用。
单线程
单线程不会带来状态同步问题,没有死锁存在,没有线程上下文交换带来性能上的开销。存在的问题是
- 无法利用多核CPU
- 错误会引起整个应用退出
- 大量计算占用CPU导致无法继续异步调用I/O
像浏览器javascript与UI共用一个线程一样,js长时间执行会导致UI的渲染和响应被中断。在Node中,长时间CPU占用会导致后续异步I/O发不出调用,已完成的异步I/O回调函数得不到及时执行。
WebWorker能够创建工作线程进行计算,以解决js大规模计算阻塞UI渲染的问题,工作线程为了不阻塞主线程,通过消息传递的方式传递运行结果,使得工作线程不能访问主线程的UI
node采用相同的思路解决单线程中的大计算量的问题,并且可以利用多核CPU,child_process
以Master-Worker的管理方式,通过将计算分发到各个子进程,再通过进程之间的事件消息来传递结果。
需要补充node的用途
网友评论