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

 更新时间:2016年11月10日 08:44:20   作者:黄明恩  
本篇文章主要介绍了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' }); 
}

运行结果如下:


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

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

相关文章

  • Node.jsv16 版本安装的实现

    Node.jsv16 版本安装的实现

    本文主要介绍了Node.jsv16 版本安装的实现,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08
  • node.js中实现双重身份验证机制的方法详解

    node.js中实现双重身份验证机制的方法详解

    双重身份验证(Two-factor authentication)是一种安全机制,它要求用户提供两种不同的身份验证因素来访问他们的帐户,下面我们就来学习一下如何使用speakeasy在nodejs中实现双重身份验证吧
    2023-10-10
  • Node.js中的require.resolve方法使用简介

    Node.js中的require.resolve方法使用简介

    在Node.js中,可以使用require.resolve函数来查询某个模块文件的带有完整绝对路径的文件名,下面这篇文章主要介绍了Node.js中require.resolve方法使用的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-04-04
  • Nodejs使用SQL模糊查询的过程详解

    Nodejs使用SQL模糊查询的过程详解

    最近在改一个比较久的项目,是使用nodejs写的,但是对于长期写java的后端开发来说,还是有点难维护,不过不改bug的话,就需要重新开发,所以本文介绍了NodeJs如何使用SQL模糊查询,需要的朋友可以参考下
    2024-07-07
  • Node使用Selenium进行前端自动化操作的代码实现

    Node使用Selenium进行前端自动化操作的代码实现

    这篇文章主要介绍了Node使用Selenium进行前端自动化操作的代码实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • gulp加批处理(.bat)实现ng多应用一键自动化构建

    gulp加批处理(.bat)实现ng多应用一键自动化构建

    这篇文章主要给大家介绍了利用gulp加上批处理(.bat)实现ng多应用一键自动化构建的相关资料,文中介绍的很详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-02-02
  • 一文搞懂npm install 意义

    一文搞懂npm install 意义

    我们在安装依赖包的时候,不需要过多的去纠结是使用 -S 还是 -D 呢 ?随便安装到 dependencies 或者 devDependencies 里都行,反正 npm install的时候,都会安装dependencies 和 devDependencies依赖,今天通过本文学习npm install意义,感兴趣的朋友跟随小编一起看看吧
    2022-12-12
  • npm镜像源更改后不生效(附淘宝镜像源)

    npm镜像源更改后不生效(附淘宝镜像源)

    淘宝的NPM镜像源registry.npm.taobao.org已经过期,导致npm install时出现证书过期错误,更换镜像源至registry.npmmirror.com后,如果仍出现错误,可能是项目中的package-lock.json或.npmrc文件锁定了旧的镜像源,本文就来介绍一下解决方法,感兴趣的可以了解一下
    2024-10-10
  • 使用Node.js创建HTTP服务器并实现公网访问本地Server的步骤

    使用Node.js创建HTTP服务器并实现公网访问本地Server的步骤

    Node.js含有一系列内置模块,使得程序可以脱离 Apache HTTP Server 或 IIS,作为独立服务器运,下面将介绍如何简单几步实现远程公共网络下访问windwos node.js的服务端,感兴趣的朋友一起看看吧
    2023-11-11
  • Node.js中require的工作原理浅析

    Node.js中require的工作原理浅析

    这篇文章主要介绍了Node.js中require的工作原理浅析,通过分析node.js的源码得到本文,需要的朋友可以参考下
    2014-06-06

最新评论