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初级阶段之express
Nov 23 NodeJs
nodejs处理图片的中间件node-images详解
May 08 NodeJs
nodejs基于WS模块实现WebSocket聊天功能的方法
Jan 12 NodeJs
nodejs连接mysql数据库及基本知识点详解
Mar 20 NodeJs
nodejs 简单实现动态html的方法
May 12 NodeJs
通过nodejs 服务器读取HTML文件渲染到页面的方法
May 17 NodeJs
NodeJS加密解密及node-rsa加密解密用法详解
Oct 12 NodeJs
NodeJs入门教程之定时器和队列
Mar 08 NodeJs
NodeJs之word文件生成与解析的实现代码
Apr 01 NodeJs
nodejs搭建本地服务器并访问文件操作示例
May 11 NodeJs
nodejs log4js 使用详解
May 31 NodeJs
Nodejs 识别图片类型的方法
Aug 15 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输出英文时间日期的安全方法(RFC 1123格式)
2014/06/13 PHP
php关键字仅替换一次的实现函数
2015/10/29 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
2020/02/21 PHP
HR vs CL BO3 第一场 2.13
2021/03/10 DOTA
js中的屏蔽的使用示例
2013/07/30 Javascript
jQuery获取复选框被选中数量及判断选择值的方法详解
2016/05/25 Javascript
Javascript小技能总结(推荐)
2016/06/02 Javascript
Augularjs-起步详解
2016/07/08 Javascript
js判断radiobuttonlist的选中值显示/隐藏其它模块的实现方法
2016/08/25 Javascript
Angularjs 实现一个幻灯片示例代码
2016/09/08 Javascript
原生js实现ajax方法(超简单)
2016/09/20 Javascript
浅析script标签中的defer与async属性
2016/11/30 Javascript
JS实现焦点图轮播效果的方法详解
2016/12/19 Javascript
vue音乐播放器插件vue-aplayer的配置及其使用实例详解
2017/07/10 Javascript
js实时监控文本框输入字数的实例代码
2018/01/18 Javascript
vue-music 使用better-scroll遇到轮播图不能自动轮播问题
2018/12/03 Javascript
微信小程序页面滚动到指定位置代码实例
2019/09/07 Javascript
vue+vant 上传图片需要注意的地方
2021/01/03 Vue.js
对python中for、if、while的区别与比较方法
2018/06/25 Python
在pycharm上mongodb配置及可视化设置方法
2018/11/30 Python
Python实现的排列组合、破解密码算法示例
2019/04/12 Python
elasticsearch python 查询的两种方法
2019/08/04 Python
python [:3] 实现提取数组中的数
2019/11/27 Python
Python对wav文件的重采样实例
2020/02/25 Python
浅析CSS3中鲜为人知的属性:-webkit-tap-highlight-color
2017/01/12 HTML / CSS
杭州龙健科技笔试题.net部分笔试题
2016/01/24 面试题
艺术应用与设计个人的自我评价
2013/11/23 职场文书
应用数学自荐书范文
2013/11/24 职场文书
2014年教师培训的自我评价
2014/01/03 职场文书
房地产开发计划书
2014/01/10 职场文书
网管求职信
2014/03/03 职场文书
计生专干事迹
2014/05/28 职场文书
竞选班干部演讲稿600字
2014/08/20 职场文书
春节晚会开场白
2015/05/29 职场文书
新闻通讯稿范文
2015/07/22 职场文书
十大公认最好看的动漫:《咒术回战》在榜,《钢之炼金术师》第一
2022/03/18 日漫