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

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

