用自己语言简单理解一下进程与线程。一台机器上可以同时运行多个程序,每个程序内可以开启多个进程,而每个进程内部又可以有多个线程(有些语言还可以在线程内部有多个纤程,但不具备代表性)。
多进程与多线程基本区别
多进程——重:有独立的存储空间
优点:安全(万一某一进程崩了,其他进程还在工作,不至于程序无法运行),简单
缺点:性能相对低点(开进程开销大)
多线程——轻:同一进程内的线程共享一块空间
优点:性能高点(开线程开销小),多个线程间通信容易
缺点:不安全(某一线程崩了影响整个进程),复杂(共享一块空间),多个线程通信太容易
node.js简单实现多进程
实际上来说,普通程序无法创建进程,只有系统可以。所以一般可以用主进程分裂(克隆)出一个子进程。node.js中可以用cluster模块实现多进程,cluster中fork()可以从主进程分裂出子进程。
注意:
只有主进程有fork(),所以在分裂出子进程时需要判断当前是否主进程。
出于安全性考虑,一般主进程只负责派生子进程,以保证程序不那么容易崩。
主进程与子进程能够共享句柄(所以同一体系内的主子进程能共享一个端口)
实现代码
const cluster = require('cluster');
const os = require('os');
const process = require('process');
const http = require('http');
const url = require('url');
const fs = require('fs');
const zlib = require('zlib');
//如果当前是主进程,则主负责克隆出子进程
if(cluster.isMaster){
for(let i=0; i<os.cpus().length; i++){
//克隆子进程
cluster.fork();
}
console.log('主进程');
}else{
http.createServer((req, res) => {
let {pathname} = url.parse(req.url);
//当前工作进程
console.log(`由${process.pid}进程处理的`);
let rs = fs.createReadStream(`.${pathname}`);
let gz = zlib.createGzip();
res.setHeader('Content-Encoding', 'gzip');
rs.pipe(gz).pipe(res);
rs.on('error', () => {
res.setHeader('Content-Encoding', 'plain');
res.writeHead(404);
res.end('NOT FOUND');
})
}).listen(8888, () => {
console.log('server listening at port 8888');
})
}
控制台打印
版权声明:本文为samfung09原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。