微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Nodejs中解决cluster模块的多进程如何共享数据问题

前述

nodejs在v0.6.x之后增加一个模块cluster用于实现多进程,利用child_process模块来创建和管理进程,增加程序在多核cpu机器上的性能表现。本文将介绍利用cluster模块创建的多线程如何共享数据的问题。

进程间数据共享

首先举个简单的例子,代码如下:

rush:js;"> 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没被共享。那么怎么来在各进程之间共享数据呢?来看下面的代码

rush:js;"> 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' });
}

运行结果如下:

因此如果需要共享数据,需要在进程间使用消息通知来达到这个目的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程之家。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐