上で述べたように
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('DATA VALUE in MainProcess: %d ' , data); } else { //子进程,会被调用numCPUs次 data++; console.log('DATA VALUE in ChildProcess %d: %d ' cluster.worker.id, data); }
実行結果は次のとおりです。プロセスコードブロックと子プロセスコードブロックは、宣言された変数をグローバル変数にするべきではないでしょうか?答えは否定的です。各プロセスはメモリ内に独自の領域を持っているため、data++ 操作は独自の領域で実行されます。これは、変数データが共有されないことを意味します。では、プロセス間でデータを共有するにはどうすればよいでしょうか?次のコードを見てみましょう:
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' }); }
したがって、データを共有する必要がある場合、この目的を達成するためにプロセス間でメッセージ通知を使用する必要があります。