ホームページ  >  記事  >  ウェブフロントエンド  >  Nodejsのクラスターモジュールで複数のプロセス間でデータを共有する方法の問題を解決する

Nodejsのクラスターモジュールで複数のプロセス間でデータを共有する方法の問題を解決する

高洛峰
高洛峰オリジナル
2016-12-07 11:40:171385ブラウズ

上で述べたように

nodejs は v0.6.x 以降にモジュール クラスターを追加してマルチプロセスを実装し、child_process モジュールを使用してプロセスを作成および管理し、マルチコア CPU マシンでのプログラムのパフォーマンスを向上させました。この記事では、クラスターモジュールを使用して作成されたマルチスレッドがどのようにデータを共有するかを紹介します。

プロセス間データ共有

まず、簡単な例を見てみましょう。コードは次のとおりです。

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

実行結果は次のとおりです。プロセスコードブロックと子プロセスコードブロックは、宣言された変数をグローバル変数にするべきではないでしょうか?答えは否定的です。各プロセスはメモリ内に独自の領域を持っているため、data++ 操作は独自の領域で実行されます。これは、変数データが​​共有されないことを意味します。では、プロセス間でデータを共有するにはどうすればよいでしょうか?次のコードを見てみましょう:

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

Nodejsのクラスターモジュールで複数のプロセス間でデータを共有する方法の問題を解決する

実行結果は次のとおりです:

したがって、データを共有する必要がある場合、この目的を達成するためにプロセス間でメッセージ通知を使用する必要があります。

Nodejsのクラスターモジュールで複数のプロセス間でデータを共有する方法の問題を解決する

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。