Nodejs中cluster模块的多进程共享数据问题
2013-05-27 12:06
441 查看
前述
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' }); }
运行结果如下:
因此如果需要共享数据,需要在进程间使用消息通知来达到这个目的。
相关文章推荐
- Nodejs中cluster模块的多进程共享数据问题
- Nodejs中解决cluster模块的多进程如何共享数据问题
- 关于Nodejs的多进程模块Cluster
- 关于Nodejs的多进程模块Cluster
- 多进程 不同地址空间的数据共享问题
- 线程间的通信 共享数据安全问题
- NodeJS的Cluster模块使用
- smartfoxserver 2x 数据共享问题
- 向同名共享内存写入的数据大小不一样问题
- nodejs 模块以及加载机制,主要讨论找不到模块的问题
- java面试题二十九 多线程数据共享问题
- 代码笔记 | 多线程使用queue模块同步访问共享数据
- 数据共享之共享数据带来的问题
- 跨进程数据共享问题及解决方案
- 多线程一共就俩问题:1.线程安全(访问共享数据) 2.线程通信(wait(),notify())
- tomcat cluster session同步时保存map数据遇到的问题
- (转)OS: 生产者消费者问题(多进程+共享内存+信号量)
- 多个线程之间共享数据的方式(卖票问题,存取款问题)
- 多线程(四) 实现线程范围内模块之间共享数据及线程间数据独立(Map集合)