nodejs 如何开启进程,进程如何通讯

113 阅读1分钟

进程 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);

}