首頁  >  文章  >  web前端  >  Nodejs中解決cluster模組的多進程如何共享資料問題

Nodejs中解決cluster模組的多進程如何共享資料問題

高洛峰
高洛峰原創
2016-12-07 11:40:171385瀏覽

前述

nodejs在v0.6.x之後增加了一個模組cluster用於實現多進程,利用child_process模組來創建和管理進程,增加程式在多核心CPU機器上的效能表現。本文將介紹利用cluster模組所建立的多執行緒如何共享資料的問題。

進程間資料共享

首先舉個簡單的例子,程式碼如下:

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++操作是在各自的區域內進行的,也就是說變數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中解決cluster模組的多進程如何共享資料問題   

運作結果如下:

因此如果需要共享數據,需要在進程間使用訊息通知來達到這個目的。

Nodejs中解決cluster模組的多進程如何共享資料問題

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn