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


Posted in NodeJs onNovember 10, 2016

前述

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

运行结果如下:Nodejs中解决cluster模块的多进程如何共享数据问题 

为什么我们在主进程代码块以及子进程代码块之外来声明的变量不应该是全局变量么?答案是否定的。因为每个进程在内存都有各自的区域,因此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 相关文章推荐
nodejs事件的监听与触发的理解分析
Feb 12 NodeJs
使用nodejs中httpProxy代理时候出现404异常的解决方法
Aug 15 NodeJs
实例分析nodejs模块xml2js解析xml过程中遇到的坑
Mar 18 NodeJs
nodejs个人博客开发第二步 入口文件
Apr 12 NodeJs
nodejs mysql 实现分页的方法
Jun 06 NodeJs
使用npm安装最新版本nodejs
Jan 18 NodeJs
nodeJs实现基于连接池连接mysql的方法示例
Feb 10 NodeJs
详解redis在nodejs中的应用
May 02 NodeJs
NodeJs 文件系统操作模块fs使用方法详解
Nov 26 NodeJs
在nodejs中创建child process的方法
Jan 26 NodeJs
Nodejs 数组的队列以及forEach的应用详解
Feb 25 NodeJs
分享node.js实现简单登录注册的具体代码
Apr 26 NodeJs
NodeJS整合银联网关支付(DEMO)
Nov 09 #NodeJs
nodejs的HTML分析利器node-jquery用法浅析
Nov 08 #NodeJs
Jquery通过ajax请求NodeJS返回json数据实例
Nov 08 #NodeJs
NodeJS和BootStrap分页效果的实现代码
Nov 07 #NodeJs
NodeJS使用formidable实现文件上传
Oct 27 #NodeJs
nodejs简单实现操作arduino
Sep 25 #NodeJs
NodeJs读取JSON文件格式化时的注意事项
Sep 25 #NodeJs
You might like
PHP图片验证码制作实现分享(全)
2012/05/10 PHP
php MessagePack介绍
2013/10/06 PHP
php根据身份证号码计算年龄的实例代码
2014/01/18 PHP
Extjs 3.3切换tab隐藏相应工具栏出现空白解决
2013/04/02 Javascript
jQuery实用基础超详细介绍
2013/04/11 Javascript
html5 canvas js(数字时钟)实例代码
2013/12/23 Javascript
深入理解Javascript里的依赖注入
2014/03/19 Javascript
JavaScript实现按Ctrl键打开新页面
2014/09/04 Javascript
js中document.write的那点事
2014/12/12 Javascript
了不起的node.js读书笔记之node.js中的特性
2014/12/22 Javascript
mvc中form表单提交的三种方式(推荐)
2016/08/10 Javascript
详解jQuery事件
2017/01/13 Javascript
详解vue.js之props传递参数
2017/12/12 Javascript
RequireJS用法简单示例
2018/08/20 Javascript
QRCode.js二维码生成并能长按识别
2018/10/16 Javascript
浅谈Angular 观察者模式理解
2018/11/01 Javascript
微信小程序上传文件到阿里OSS教程
2019/05/20 Javascript
bootstrap table.js动态填充单元格数据的多种方法
2019/07/18 Javascript
jQuery实现电梯导航模块
2020/12/22 jQuery
利用Python的Twisted框架实现webshell密码扫描器的教程
2015/04/16 Python
由Python运算π的值深入Python中科学计算的实现
2015/04/17 Python
TensorFlow模型保存和提取的方法
2018/03/08 Python
Python中format()格式输出全解
2019/04/12 Python
python操作cfg配置文件方式
2019/12/22 Python
python 实现屏幕录制示例
2019/12/23 Python
Python操作MongoDb数据库流程详解
2020/03/05 Python
Python实现常见的几种加密算法(MD5,SHA-1,HMAC,DES/AES,RSA和ECC)
2020/05/09 Python
基于MUI框架使用HTML5实现的二维码扫描功能
2018/03/01 HTML / CSS
国际领先的学术出版商:Springer
2017/01/11 全球购物
德国高尔夫商店:Golfshop.de
2019/06/22 全球购物
马来西亚户外装备商店:PTT Outdoor
2019/07/13 全球购物
Python的两道面试题
2013/06/29 面试题
品德评语大全
2014/05/05 职场文书
导游词之海南-南湾猴岛
2019/10/12 职场文书
Idea连接MySQL数据库出现中文乱码的问题
2021/04/14 MySQL
Python中Matplotlib的点、线形状、颜色以及绘制散点图
2022/04/07 Python