AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > JavaScript

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

51自学网 http://www.wanshiok.com
nodejs,cluster,nodejs,多进程

前述

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' }); }

运行结果如下:


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

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


nodejs,cluster,nodejs,多进程  
上一篇:JavaScript中如何使用cookie实现记住密码功能及cookie相关函数介绍  下一篇:easyui中combotree循环获取父节点至根节点并输出路径实现方法