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

來源:互聯網
上載者:User

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

前述

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('DATA VALUE in MainProcess: %d ' , data);} else { //子進程,會被調用numCPUs次  data++;  console.log('DATA VALUE in ChildProcess %d: %d ' cluster.worker.id, data);}

運行結果如下: 

為什麼我們在主進程代碼塊以及子進程代碼塊之外來聲明的變數不應該是全域變數嗎?答案是否定的。因為每個進程在記憶體都有各自的地區,因此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' }); }

運行結果如下:


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

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援幫客之家。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.