🔥真是有手就行,十行代码实现多进程通信-nodejs
上篇文章讲了如何在Node Server中实现多进程,这篇文章来讲如今在多进程之间保持状态同步。有个需求,服务端记录客户端请求的次数举个例子,有两个进程,进程A和进程B。这时客户端来一个请求,进程A来处理请求,那进程A就要记录一下,来一个记录一个。那进程B处理请求的时候,它增加次数,就需要在进程A的基础之上增加了。这样才能保证数据的正确性。下面来实现这个需求
创建一个多进程的服务器
// index.js
const cluster = require("cluster");
const http = require("http");
const numCPUs = require("os").cpus().length;
//judge if current method is master
if (cluster.isMaster) {
//run code of master
console.log("master: ");
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
} else {
//run code of son method
http.createServer((req, res) => {
res.end("hello world");
}).listen(8089, () => {
console.log("listen 8089",cluster.worker.id);
});
}
创建一个文件index.js, 通过--判断是否为主进程,如果是主进程,就执行主进程的代码;如果不是,就执行子进程代码。主进程主要用来根据CPU的核数来创建子进程。子进程一旦被创建,就会执行和主进程相同的文件。子进程的主要代码是创建一个http服务,并且全都监听8089端口
具体多进程内容讲解,可以看看这篇文章,写得很棒:这也太简单了吧,用Node实现服务器多进程并发 - 掘金
执行看看
node index.js

我电脑是12核,所以创建了12个子进程
实现进程间的通信
首先,我们要知道,子进程之间是不能互相直接通信的,只有主进程和子进程之间能够通信,所以子进程之间通信必须通过主进程作为桥梁。那主进程与子进程是如何通信的呢?
//index.js
if (cluster.isMaster) {
//run code of master
console.log("master: ");
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on("message", (worker, data) => {
console.log("receive message from worker: ", worker.id);
console.log("the content message is ", data);
});
}else {
http.createServer((req, res) => {
res.end("hello world");
cluster.worker.send("there is a requesting");
}).listen(8089, () => {
console.log("listen 8089", cluster.worker.id);
});
}
子进程通过cluster.worker.send()
来发送消息。而主进程则通过cluster.on("message",()=>{})
来监听子进程的消息。下面是控制台截图:
我从客户端访问了两次,共有两个子进程处理了我的请求,分别是进程2,和进程3
在主进程收到消息之后,就需要将信息发给其他的子进程了
if (cluster.isMaster) {
console.log("master: ");
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
function broadcast(worker, message) {
Object.values(cluster.workers).forEach((worker) => {
worker.send(message);
});
}
cluster.on("message", broadcast);
} else {
const worker = cluster.worker;
let count = 0;
worker.on("message", (data) => {
if (data === "count") {
count++;
console.log("counts: ", count, " current worker is ", worker.id);
}
});
http.createServer((req, res) => {
res.end("hello world");
if (req.url === "/") worker.send("count");
}).listen(8089, () => {
console.log("listen 8089", worker.id);
});
}
代码中,主进程在收到消息之后,就将通过broadcast()
方法将信息发送给其他子进程
一旦其中一个进程收到了消息,会立马通过发送给主进程。然后所有的子进程包括自己都能知道客户端来了一请求了~
注:在broadcast
方法中,是通过遍历每个子进程,向自己发送消息。但执行发送的代码必须在主进程环境中。在子进程的执行环境中,自己向自己发送消息也是行不通的。
总结:
这篇文章讲了如何在进程中同步状态。代码不难,难的是理解进程之间是如何通信的。本文代码清晰,例子丰富,讲解到位,是个不可多得的好文章。想要了解更多关于nodejs多进程的内容,可以看这篇文章:这也太简单了吧,用Node实现服务器多进程并发 - 掘金
转载自:https://juejin.cn/post/7248388270722793530