Nodejs中cluster模块的多进程共享数据问题

Nodejs中cluster模块的多进程共享数据问题

前述

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

  运行结果如下:

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

转自(http://www.cnblogs.com/CodeGuy/archive/2013/05/27/3101312.html)

时间: 2024-08-08 04:37:52

Nodejs中cluster模块的多进程共享数据问题的相关文章

Nodejs中关于模块的总结

关于Nodejs中的模块 概念 Nodejs在ECMAScript的基础上扩展并封装了许多高级特性,如文件访问.网络访问等,使得Nodejs成为一个很好的Web开发平台.基于Nodejs这个平台将Web开发常用的一些功能进行封装,称为模块. 1.系统模块 1. 模块被加载后才能使用,Nodejs提供了全局的函数require加载模块. 1.os模块 获取当前操作系统信息 2.fs模块 文件读写操作 3.path模块 路径处理 2. require加载模块路径 相对路径: 如 ./ 或 ../ 绝

cluster模块实现多进程-让我的代理服务速度飞起来了

cluster模块实现多进程 现在的cluster已经可以说完全做到的负载均衡,在做代理服务和http服务器的时候能够讲服务器性能发挥到最大.来看一下具体的实现吧 var cluster = require('cluster'); var http = require('http'); var numCPUs = require('os').cpus().length; if (cluster.isMaster) { console.log('[master] ' + "start master

nodejs中cluster的运用

nodejs中cluster的运用 by 伍雪颖 var cluster = require('cluster'); var http = require('http'); var numCPUs = require('os').cpus().length; if (cluster.isMaster) { for (var i=0;i<numCPUs;i++) { cluster.fork(); } cluster.on('exit',function(worker,code,signal) {

Android开发中多进程共享数据

# 背景 最近在工作中遇到一个需求,需要在接收到推送的时候将推送获得的数据存起来,以供app启动时使用.我们会认为这不是So easy吗?只要把数据存到SharedPreferences中,然后让app打开同一个SharedPreferences读取数据就可以了.但是在实际的测试中,我们发现推送进程存入的数据,并不能在app进程中获得.所以这是为什么呢,也许聪明的读者从我们上面的陈述中已经发现了原因,因为我们有两个进程,推送进程负责将推送数据存入,而app进程负责读取,但是正是由于是两个进程,如

CommonJs 和 Nodejs 中自定义模块 (3)

一. 什么是 CommonJs? CommonJS 规范的提出,主要是为了弥补当前 JavaScript 没有标准的缺陷. 它的终极目标就是: 提供一个类似 Python, Ruby 和 Java 语言的标准库 . CommonJS 就是模块化的标准, nodejs 就是 CommonJS(模块化) 的实现. 二 Nodejs中的模块化 1 核心模块[http模块, url模块 , Fs模块] 2 文件模块[用户形式] 三 自定义模块 第一步: 我们可以把公共的功能抽离成一个单独的js文件作为一

Nodejs中puppeteer抓取浏览器HAR数据

有这么一个需求,首先从csv文件中读取要解析的url数据,然后使用puppeteer和puppeteer-har来获取浏览器的HAR数据.在调试的过程中,发现在for循环中怎么操作都是异步的,最后找到了一个解决方案,也算在此记录. har.js const puppeteer = require('puppeteer'); const PuppeteerHar = require('puppeteer-har'); /* (async () => { const browser = await

NodeJS的Cluster模块使用

一.前言大家都知道nodejs是一个单进程单线程的服务器引擎,不管有多么的强大硬件,只能利用到单个CPU进行计算.所以,有人开发了第三方的cluster,让node可以利用多核CPU实现并行. 随着nodejs的发展,让nodejs上生产环境,就必须是支持多进程多核处理!在V0.6.0版本,Nodejs内置了cluster的特性.自此,Nodejs终于可以作为一个独立的应用开发解决方案,映入大家眼帘了. 最简单的例子: var cluster = require('cluster'); var

NodeJS中Buffer模块详解

一,开篇分析 所谓缓冲区Buffer,就是 "临时存贮区" 的意思,是暂时存放输入输出数据的一段内存. JS语言自身只有字符串数据类型,没有二进制数据类型,因此NodeJS提供了一个与String对等的全局构造函数Buffer来提供对二进制数据的操作.除了可以读取文件得到Buffer的实例外,还能够直接构造,例如: 复制代码 代码如下: var buffer = new Buffer([ 0x68, 0x65, 0x6c, 0x6c, 0x6f ]) ; Buffer与字符串类似,除了

servlet中同一用户不同页面共享数据(sendRedirect、session、隐藏表单)

SendRedirect(“url?parameter=value”); 通过SendRedirect()我们可以将一个页面的信息传递给另外的页面. 注意:1.url表示要跳转到的servlet的url 2.servlet url名和变量之间有?号 3.如果要传递两个以上的值,他们之间要用&号分开,比如: sendRedirect(“url?parameter1=”+val1+”&parameter2=”+val2); 4.传递中文:res.setContentType("tex