进程 process vs 线程 thread
-
进程,操作系统进行资源分配和调度的最小单位,有独立内存空间
-
线程,操作系统进行运算调度的最小单位,共享进程内存空间,一个进程可以包含多个线程
为何需要多进程
-
多核 CPU,更适合处理多进程
-
内存较大,多个进程才能更好的利用(单进程有内存上限)
-
总之,压榨机器资源,更快,更节省
nodejs 开启子进程(fork方式)
开启子进程用来做耗时的计算
const http = require("http");
const fork = require("child_process").fork;
const server = http.createServer((req, res) => {
if(req.url === "/get-sum") {
console.log("主进程pid: ", process.pid);
// 开启子进程
const computedProcess = fork("./computed.js");
// 向子进程发送消息
computedProcess.send("开始进行计算");
// 接收子进程消息
computedProcess.on("message", data => {
console.log("主进程接收到信息: ", data);
res.end("sum is " + data);
})
computedProcess.on("close", () => {
console.log("子进程因报错而退出");
computedProcess.kill();
res.end("error");
})
}
});
server.listen(3000, () => {
console.log("localhost: 3000");
})
/**
* 子进程
*/
function getSum() {
let sum = 0;
for(let i = 0; i < 100000; i++) {
sum += i;
}
return sum;
}
process.on("message", data => {
console.log("子进程pid: ", process.pid);
console.log("子进程接收到信息: ", data);
const sum = getSum();
// 发送消息给主进程
process.send(sum);
})
nodejs 开启子进程(cluster方式)
const http = require("http");
const cpuCoreLength = require("os").cpus().length;
const cluster = require("cluster");
if(cluster.isMaster) {
for(let i = 0; i < cpuCoreLength; i++) {
cluster.fork(); // 开启子进程
}
cluster.on("exit", worker => {
console.log("子进程退出");
cluster.fork(); // 进程守护
})
}else {
// 多个子进程会共享一个 TCP 连接,提供一份网络服务
const server = http.createServer((req, res) => {
res.writeHead(200);
res.end("done");
})
server.listen(3000);
}