作者:安乐乐520 | 来源:互联网 | 2023-07-10 12:15
最重要的一句话刻在心里:JS是单线程的
进程(process)和线程(thread)的区别
- 进程,OS 进行资源分配和调度的最小单位,有独立内存空间
- 线程,OS 进行运算调度的最小单位,共享进程内存空间
为何需要多进程
- 多核 CPU,更适合处理多进程
- 内存较大,多个进程才能更好的利用(单进程有内存上限)
总之,是为了“压榨”机器资源。
Nodejs 开启多进程的方式:
- webWorker 方式开启多进程(此方法在浏览器中也可以使用,我的使用例子就是 webview 中,Custom Dashboard 项目里面,为了和 desktop 进行通讯,会使用 webWorker.postMessage() 方法发送数据给 desktop,使用 window.addEventListener(“message”, () => {}) 来接收 desktop 的数据)
- fork
- cluster
使用 child_process.fork 方式
const fork = require("child_process").fork;
下面 demo 一个创建子进程的例子,该例子先创建一个 server,启动服务之后访问 localhost:3000/get-sum ,页面会打印 sum is 4995500 字符串。
const http = require("http");
const fork = require("child_process").fork;const server = http.createServer((req, res) => {if (req.url === "/get-sum") {console.info("主进程 id", process.pid);const computeProcess = fork("./compute.js");computeProcess.send("开始计算");computeProcess.on("message", data => {console.info("主进程接收到的信息:", data);res.end("sum is " + data);});computeProcess.on("close", () => {console.info("子进程因报错而退出");res.end("error");})}
});
server.listen(3000, () => {console.info("localhost:3000");
});
function getSum() {let sum &#61; 0;for (let i &#61; 0; i< 10000; i &#43;&#43;) {sum &#43;&#61; i;}return sum;
}
process.on("message", data &#61;> {console.info("子进程 id", process.pid);console.info("子进程接收到的信息&#xff1a;", data);const sum &#61; getSum();process.send(sum);});
使用 cluster 方式
运行 node cluster.js&#xff0c;访问 localhost:3000&#xff0c;页面会打印出 done。
const http &#61; require("http");
const cpuCoreLength &#61; require("os").cpus().length;
const cluster &#61; require("cluster");
if (cluster.isMaster) {for (let i &#61; 0; i < cpuCoreLength; i &#43;&#43;) {cluster.fork(); }cluster.on("exit", worker &#61;> {console.info("子进程退出");cluster.fork(); });
} else {const server &#61; http.createServer((req, res) &#61;> {res.writeHead(200);res.end("done");});server.listen(3000);
}
但是&#xff0c;实际工作中&#xff0c;我们想要进程守护&#xff0c;会用 pm2 这个包&#xff0c;开启多个进程。
使用 send 和 on 来进行通讯