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访问ActiveX对象,以操作Access数据库为例。
Dec 15 NodeJs
Nodejs实现的一个简单udp广播服务器、客户端
Sep 25 NodeJs
nodejs实现的一个简单聊天室功能分享
Dec 06 NodeJs
nodejs实现HTTPS发起POST请求
Apr 23 NodeJs
nodejs修复ipa处理过的png图片
Feb 17 NodeJs
NodeJs的优势和适合开发的程序
Aug 14 NodeJs
windows 下安装nodejs 环境变量设置
Feb 02 NodeJs
angular2+nodejs实现图片上传功能
Mar 27 NodeJs
用Nodejs搭建服务器访问html、css、JS等静态资源文件
Apr 28 NodeJs
Nodejs对postgresql基本操作的封装方法
Feb 20 NodeJs
nodejs语言实现验证码生成功能的示例代码
Oct 13 NodeJs
在nodejs中创建child process的方法
Jan 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
ThinkPHP框架设计及扩展详解
2014/11/25 PHP
PHP file_get_contents函数读取远程数据超时的解决方法
2015/05/13 PHP
PHP生成(支持多模板)二维码海报代码
2018/04/30 PHP
解决php用mysql方式连接数据库出现Deprecated报错问题
2019/12/25 PHP
js电信网通双线自动选择技巧
2008/11/18 Javascript
JQuery 选择器、过滤器介绍
2011/02/14 Javascript
jQuery动态改变图片显示大小(修改版)的实现思路及代码
2013/12/24 Javascript
AngularJS入门教程(一):静态模板
2014/12/06 Javascript
node.js中的fs.fchown方法使用说明
2014/12/16 Javascript
JavaScript中函数表达式和函数声明及函数声明与函数表达式的不同
2015/11/15 Javascript
Jquery1.9.1源码分析系列(六)延时对象应用之jQuery.ready
2015/11/24 Javascript
两种js监听滚轮事件的实现方法
2016/05/13 Javascript
深入理解jQuery layui分页控件的使用
2016/08/17 Javascript
jQuery中Nicescroll滚动条插件的用法
2016/11/10 Javascript
JS返回只包含数字类型的数组实例分析
2016/12/16 Javascript
three.js快速入门【推荐】
2017/01/21 Javascript
JS触摸与手势事件详解
2017/05/09 Javascript
JS对象与JSON互转换、New Function()、 forEach()、DOM事件流等js开发基础小结
2017/08/10 Javascript
Vue中用props给data赋初始值遇到的问题解决
2018/11/27 Javascript
vue移动端使用appClound拉起支付宝支付的实现方法
2019/11/21 Javascript
JS数组方法join()用法实例分析
2020/01/18 Javascript
[47:18]完美世界DOTA2联赛循环赛 IO vs FTD BO2第一场 11.05
2020/11/06 DOTA
python获取糗百图片代码实例
2013/12/18 Python
python连接字符串的方法小结
2015/07/13 Python
python绘制中国大陆人口热力图
2018/11/07 Python
python中类的属性和方法介绍
2018/11/27 Python
python使用beautifulsoup4爬取酷狗音乐代码实例
2019/12/04 Python
CSS3实现各种图形的示例代码
2016/10/19 HTML / CSS
美国家用电器和电子产品商店:Abt
2016/09/06 全球购物
跑鞋、网球鞋、网球拍、服装及装备:Holabird Sports
2016/09/19 全球购物
Otel.com:折扣酒店预订
2017/08/24 全球购物
C语言笔试集
2012/07/24 面试题
环保倡议书100字
2014/05/15 职场文书
初中信息技术教学反思
2016/02/16 职场文书
小学2016年“我们的节日·重阳节”活动总结
2016/04/01 职场文书
SQL Server表分区删除详情
2021/10/16 SQL Server