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学习笔记之(Url,QueryString,Path)模块
Jan 13 NodeJs
nodejs通过phantomjs实现下载网页
May 04 NodeJs
nodejs连接mongodb数据库实现增删改查
Dec 01 NodeJs
Nodejs读取文件时相对路径的正确写法(使用fs模块)
Apr 27 NodeJs
用Nodejs搭建服务器访问html、css、JS等静态资源文件
Apr 28 NodeJs
nodejs中sleep功能实现暂停几秒的方法
Jul 12 NodeJs
用nodejs实现json和jsonp服务的方法
Aug 25 NodeJs
Windows下使用Nodejs运行js的方法
Sep 02 NodeJs
nodejs 日志模块winston的使用方法
May 02 NodeJs
CentOS7中源码编译安装NodeJS的完整步骤
Oct 13 NodeJs
Nodejs环境实现socket通信过程解析
Jul 03 NodeJs
NodeJs内存占用过高的排查实战记录
May 10 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 输出URL的快捷方式示例代码
2013/09/22 PHP
Laravel统计一段时间间隔的数据方法
2019/10/09 PHP
laytpl 精致巧妙的JavaScript模板引擎
2014/08/29 Javascript
如何调试异步加载页面里包含的js文件
2014/10/30 Javascript
JavaScript中使用Math.PI圆周率属性的方法
2015/06/14 Javascript
jQuery多条件筛选如何实现
2015/11/04 Javascript
Bootstrap 附加导航(Affix)插件实例详解
2016/06/01 Javascript
原生js代码实现图片放大境效果
2016/10/30 Javascript
js处理层级数据结构的方法小结
2017/01/17 Javascript
bootstrap table插件的分页与checkbox使用详解
2017/07/23 Javascript
使用react实现手机号的数据同步显示功能的示例代码
2018/04/03 Javascript
Redux实现组合计数器的示例代码
2018/07/04 Javascript
JavaScript树的深度优先遍历和广度优先遍历算法示例
2018/07/30 Javascript
Vue 重置组件到初始状态的方法示例
2018/10/10 Javascript
微信小程序封装的HTTP请求示例【附升级版】
2019/05/11 Javascript
微信小程序判断页面是否从其他页面返回的实例代码
2019/07/03 Javascript
JS替换字符串中指定位置的字符(多种方法)
2020/05/28 Javascript
JS出现404错误原理及解决方案
2020/07/01 Javascript
[14:20]刀塔大凶女神互压各路奇葩屌丝
2014/05/16 DOTA
在Python中用has_key()方法查找键是否存在的教程
2015/05/21 Python
python版学生管理系统
2018/01/10 Python
理论讲解python多进程并发编程
2018/02/09 Python
Python 读取图片文件为矩阵和保存矩阵为图片的方法
2018/04/27 Python
Python 互换字典的键值对实例
2019/02/12 Python
Django中使用haystack+whoosh实现搜索功能
2019/10/08 Python
Python TKinter如何自动关闭主窗口
2020/02/26 Python
Pandas对DataFrame单列/多列进行运算(map, apply, transform, agg)
2020/06/14 Python
Python中logger日志模块详解
2020/08/04 Python
Stuarts London美国/加拿大:世界领先的独立男装零售商之一
2019/03/18 全球购物
机械工程师岗位职责
2014/06/16 职场文书
2014年师德师风工作总结
2014/11/25 职场文书
2014年应急工作总结
2014/12/11 职场文书
任命书怎么写
2015/03/02 职场文书
2015年度个人业务工作总结
2015/04/27 职场文书
nginx搭建图片服务器的过程详解(root和alias的区别)
2021/03/31 Servers
PYTHON InceptionV3模型的复现详解
2022/05/06 Python