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 模块开发及发布详解分享
Mar 07 NodeJs
nodejs教程 安装express及配置app.js文件的详细步骤
May 11 NodeJs
14款NodeJS Web框架推荐
Jul 11 NodeJs
基于NodeJS的前后端分离的思考与实践(四)安全问题解决方案
Sep 26 NodeJs
浅谈NodeJS中require路径问题
May 07 NodeJs
Nodejs如何搭建Web服务器
Mar 28 NodeJs
nodejs个人博客开发第三步 载入页面
Apr 12 NodeJs
nodejs集成sqlite使用示例
Jun 05 NodeJs
NodeJS自定义模块写法(详解)
Jun 27 NodeJs
Windows下使用Nodejs运行js的方法
Sep 02 NodeJs
nodejs dgram模块广播+组播的实现示例
Nov 04 NodeJs
一文秒懂nodejs中的异步编程
Jan 28 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
人族 Terran 基本策略
2020/03/14 星际争霸
CakePHP框架Session设置方法分析
2017/02/23 PHP
驱动事件的addEvent.js代码
2007/03/27 Javascript
JS getAttribute和setAttribute(取得和设置属性)的使用介绍
2013/07/10 Javascript
js 调用父窗口的具体实现代码
2013/07/15 Javascript
js post提交调用方法
2014/02/12 Javascript
JavaScript中实现单体模式分享
2015/01/29 Javascript
javascript判断css3动画结束 css3动画结束的回调函数
2015/03/10 Javascript
JS定义网页表单提交(submit)的方法
2015/03/20 Javascript
jQuery实现不断闪烁文字的方法
2015/05/15 Javascript
js点击文本框弹出可选择的checkbox复选框
2016/02/03 Javascript
JavaScript的Backbone.js框架环境搭建及Hellow world示例
2016/05/07 Javascript
javascript 跨域问题以及解决办法
2017/07/17 Javascript
JavaScript执行环境及作用域链实例分析
2018/08/01 Javascript
快速解决angularJS中用post方法时后台拿不到值的问题
2018/08/14 Javascript
vue使用lodop打印控件实现浏览器兼容打印的方法
2021/02/07 Vue.js
[06:07]刀塔密之二:攻之吾命受之吾幸
2014/07/03 DOTA
[02:11]2016国际邀请赛中国区预选赛最美TA采访现场玩家
2016/06/28 DOTA
Python中强大的命令行库click入门教程
2016/12/26 Python
Python编程使用tkinter模块实现计算器软件完整代码示例
2017/11/29 Python
python3基于TCP实现CS架构文件传输
2018/07/28 Python
python数据库开发之MongoDB安装及Python3操作MongoDB数据库详细方法与实例
2020/03/18 Python
在python中求分布函数相关的包实例
2020/04/15 Python
python实时监控logstash日志代码
2020/04/27 Python
Pycharm常用快捷键总结及配置方法
2020/11/14 Python
英国最大的网上药品商店:Chemist Direct
2017/12/16 全球购物
澳大利高级泳装品牌:Bondi Born
2018/05/23 全球购物
加拿大时装零售商:Influence U
2018/12/22 全球购物
历史教育专业个人求职信
2013/12/13 职场文书
大二学期个人自我评价
2014/01/13 职场文书
教师三严三实学习心得体会
2014/10/11 职场文书
公路局群众路线教育实践活动第一阶段工作汇报
2014/10/25 职场文书
夫妻分居协议书范本
2014/11/28 职场文书
2015年党员自我剖析材料
2014/12/17 职场文书
国际贸易实训总结
2015/08/03 职场文书
Python中seaborn库之countplot的数据可视化使用
2021/06/11 Python