Home > Article > Web Front-end > Solve the problem of how to share data among multiple processes in the cluster module in Nodejs
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('DATA VALUE in MainProcess: %d ' , data); } else { //子进程,会被调用numCPUs次 data++; console.log('DATA VALUE in ChildProcess %d: %d ' cluster.worker.id, data); }
The running results are as follows:
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('cluster'); var http = require('http'); if (cluster.isMaster) { var numCPUs = require('os').cpus().length; var data = 0; // 启动多个进程. for (var i = 0; i < numCPUs; i++) { //增加一个进程 var worker_process = cluster.fork(); //侦听子进程的message事件 worker_process.on('message', function(msg) { if (msg.cmd && msg.cmd == 'notifyRequest') { data++; console.log('DATA VALUE : %d ', data); } }); } } else { process.send({ cmd: 'notifyRequest' }); }
The running results are as follows:
So if you need to share data, you need to use message notifications between processes to achieve this purpose.