Home  >  Article  >  Web Front-end  >  Solve the problem of how to share data among multiple processes in the cluster module in Nodejs

Solve the problem of how to share data among multiple processes in the cluster module in Nodejs

高洛峰
高洛峰Original
2016-12-07 11:40:171415browse

As mentioned above

nodejs added a module cluster after v0.6.x to implement multi-process, using the child_process module to create and manage processes, and increase the performance of the program on multi-core CPU machines. This article will introduce how multi-threads created using the cluster module share data.

Inter-process data sharing

First, let’s take a simple example. The code is as follows:

var cluster = require('cluster');
var data = 0;//这里定义数据不会被所有进程共享,各个进程有各自的内存区域
if (cluster.isMaster) { //主进程
 var numCPUs = require('os').cpus().length;
 for (var i = 0; i < numCPUs; i++) {
  var worker = cluster.fork();
 }
 data++;
 console.log(&#39;DATA VALUE in MainProcess: %d &#39; , data);
} else { //子进程,会被调用numCPUs次
 data++;
 console.log(&#39;DATA VALUE in ChildProcess %d: %d &#39; cluster.worker.id, data);
}

The running results are as follows:

Solve the problem of how to share data among multiple processes in the cluster module in Nodejs

Why are we outside the main process code block and sub-process code block? Shouldn't the declared variables be global variables? the answer is negative. Because each process has its own area in memory, the data++ operation is performed in its own area, which means that the variable data is not shared. So how to share data between processes? Let’s look at the following code:

var cluster = require(&#39;cluster&#39;);
var http = require(&#39;http&#39;);
  
if (cluster.isMaster) {
 var numCPUs = require(&#39;os&#39;).cpus().length;
 var data = 0;
 // 启动多个进程.
 for (var i = 0; i < numCPUs; i++) {
 //增加一个进程
 var worker_process = cluster.fork();
 //侦听子进程的message事件
 worker_process.on(&#39;message&#39;, function(msg) {
  if (msg.cmd && msg.cmd == &#39;notifyRequest&#39;) {
  data++;
  console.log(&#39;DATA VALUE : %d &#39;, data);
  }
 });
 }
} else {
 process.send({ cmd: &#39;notifyRequest&#39; });
}

The running results are as follows:

Solve the problem of how to share data among multiple processes in the cluster module in Nodejs

So if you need to share data, you need to use message notifications between processes to achieve this purpose.


Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn