likes
comments
collection
share

🔥真是有手就行,十行代码实现多进程通信-nodejs

作者站长头像
站长
· 阅读数 14

上篇文章讲了如何在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
🔥真是有手就行,十行代码实现多进程通信-nodejs

我电脑是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",()=>{})来监听子进程的消息。下面是控制台截图:🔥真是有手就行,十行代码实现多进程通信-nodejs

我从客户端访问了两次,共有两个子进程处理了我的请求,分别是进程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()方法将信息发送给其他子进程🔥真是有手就行,十行代码实现多进程通信-nodejs

一旦其中一个进程收到了消息,会立马通过发送给主进程。然后所有的子进程包括自己都能知道客户端来了一请求了~

注:在broadcast方法中,是通过遍历每个子进程,向自己发送消息。但执行发送的代码必须在主进程环境中。在子进程的执行环境中,自己向自己发送消息也是行不通的。

总结:

这篇文章讲了如何在进程中同步状态。代码不难,难的是理解进程之间是如何通信的。本文代码清晰,例子丰富,讲解到位,是个不可多得的好文章。想要了解更多关于nodejs多进程的内容,可以看这篇文章:这也太简单了吧,用Node实现服务器多进程并发 - 掘金