Heim  >  Artikel  >  Web-Frontend  >  Lösen Sie das Problem, wie Daten zwischen mehreren Prozessen im Clustermodul in Nodejs gemeinsam genutzt werden können

Lösen Sie das Problem, wie Daten zwischen mehreren Prozessen im Clustermodul in Nodejs gemeinsam genutzt werden können

高洛峰
高洛峰Original
2016-12-07 11:40:171385Durchsuche

Vorhergehendes

nodejs hat nach v0.6.x einen Modulcluster hinzugefügt, um Multiprozesse zu implementieren, wobei das Modul child_process zum Erstellen und Verwalten von Prozessen verwendet wird, um die Leistung des Programms auf Multicore zu steigern CPU-Maschinenleistung. In diesem Artikel wird erläutert, wie mit dem Clustermodul erstellte Multithreads Daten gemeinsam nutzen.

Datenaustausch zwischen Prozessen

Nehmen wir zunächst ein einfaches Beispiel. Der Code lautet wie folgt:

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);
}

Die laufenden Ergebnisse lauten wie folgt:

Lösen Sie das Problem, wie Daten zwischen mehreren Prozessen im Clustermodul in Nodejs gemeinsam genutzt werden können

Warum sollten die von uns deklarierten Variablen nicht außerhalb des Hauptprozesscodeblocks und des Unterprozesscodeblocks liegen? globale Variablen sein? Die Antwort ist nein. Da jeder Prozess über einen eigenen Bereich im Speicher verfügt, wird die data++-Operation in einem eigenen Bereich ausgeführt, was bedeutet, dass die variablen Daten nicht gemeinsam genutzt werden. Wie können also Daten zwischen Prozessen ausgetauscht werden? Schauen wir uns den folgenden Code an:

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; });
}

Die laufenden Ergebnisse lauten wie folgt:

Lösen Sie das Problem, wie Daten zwischen mehreren Prozessen im Clustermodul in Nodejs gemeinsam genutzt werden können

Wenn Sie also Daten austauschen müssen, ist die Verwendung von Nachrichtenbenachrichtigungen zwischen Prozessen erforderlich, um diesen Zweck zu erreichen.


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn