Nodejs中解決cluster模塊的多進程如何共享數(shù)據(jù)問題
前述
nodejs在v0.6.x之后增加了一個模塊cluster用于實現(xiàn)多進程,利用child_process模塊來創(chuàng)建和管理進程,增加程序在多核CPU機器上的性能表現(xiàn)。本文將介紹利用cluster模塊創(chuàng)建的多線程如何共享數(shù)據(jù)的問題。
進程間數(shù)據(jù)共享
首先舉個簡單的例子,代碼如下:
var cluster = require('cluster');
var data = 0;//這里定義數(shù)據(jù)不會被所有進程共享,各個進程有各自的內(nèi)存區(qū)域
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 { //子進程,會被調(diào)用numCPUs次
data++;
console.log('DATA VALUE in ChildProcess %d: %d ' cluster.worker.id, data);
}
運行結果如下:
為什么我們在主進程代碼塊以及子進程代碼塊之外來聲明的變量不應該是全局變量么?答案是否定的。因為每個進程在內(nèi)存都有各自的區(qū)域,因此data++操作是在各自的區(qū)域內(nèi)進行的,也就是說變量data沒被共享。那么怎么來在各進程之間共享數(shù)據(jù)呢?來看下面的代碼:
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' });
}
運行結果如下:

因此如果需要共享數(shù)據(jù),需要在進程間使用消息通知來達到這個目的。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Node.js中的require.resolve方法使用簡介
在Node.js中,可以使用require.resolve函數(shù)來查詢某個模塊文件的帶有完整絕對路徑的文件名,下面這篇文章主要介紹了Node.js中require.resolve方法使用的相關資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-04-04
Node使用Selenium進行前端自動化操作的代碼實現(xiàn)
這篇文章主要介紹了Node使用Selenium進行前端自動化操作的代碼實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-10-10
gulp加批處理(.bat)實現(xiàn)ng多應用一鍵自動化構建
這篇文章主要給大家介紹了利用gulp加上批處理(.bat)實現(xiàn)ng多應用一鍵自動化構建的相關資料,文中介紹的很詳細,需要的朋友可以參考借鑒,下面來一起看看吧。2017-02-02
使用Node.js創(chuàng)建HTTP服務器并實現(xiàn)公網(wǎng)訪問本地Server的步驟
Node.js含有一系列內(nèi)置模塊,使得程序可以脫離 Apache HTTP Server 或 IIS,作為獨立服務器運,下面將介紹如何簡單幾步實現(xiàn)遠程公共網(wǎng)絡下訪問windwos node.js的服務端,感興趣的朋友一起看看吧2023-11-11

