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)文章
搭建簡(jiǎn)單的nodejs http服務(wù)器詳解
本篇文章主要介紹了搭建簡(jiǎn)單的nodejs服務(wù)器詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-03-03
node.js 使用ejs模板引擎時(shí)后綴換成.html
本文給大家分享一個(gè)nodejs的小技巧,將ejs模板引擎的模板后綴改成.html的使用方法,非常的簡(jiǎn)單實(shí)用,這里推薦給大家。2015-04-04
Postman xmysql不切換環(huán)境緩存數(shù)據(jù)到本地
這篇文章主要為大家介紹了Postman xmysql不切換環(huán)境緩存數(shù)據(jù)到本地示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
node.js中的events.emitter.listeners方法使用說明
這篇文章主要介紹了node.js中的events.emitter.listeners方法使用說明,本文介紹了events.emitter.listeners 的方法說明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下2014-12-12
詳解用node-images 打造簡(jiǎn)易圖片服務(wù)器
本篇文章主要介紹了詳解用node-images 打造簡(jiǎn)易圖片服務(wù)器,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05
詳解基于node.js的腳手架工具開發(fā)經(jīng)歷
這篇文章主要介紹了詳解基于node.js的腳手架工具開發(fā)經(jīng)歷,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-01-01

