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 相关文章推荐
Windows系统下使用Sublime搭建nodejs环境
Apr 13 NodeJs
nodejs的HTML分析利器node-jquery用法浅析
Nov 08 NodeJs
nodejs基础应用
Feb 03 NodeJs
详解nodejs微信公众号开发——5.素材管理接口
Apr 11 NodeJs
详解nodejs微信公众号开发——6.自定义菜单
Apr 13 NodeJs
理解nodejs的stream和pipe机制的原理和实现
Aug 12 NodeJs
nodejs动态创建二维码的方法
Aug 12 NodeJs
使用vs code开发Nodejs程序的使用方法
Sep 21 NodeJs
nodejs async异步常用函数总结(推荐)
Nov 17 NodeJs
nodejs微信扫码支付功能实现
Feb 17 NodeJs
Nodejs异步回调之异常处理实例分析
Jun 22 NodeJs
nodejs log4js 使用详解
May 31 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
消息持续发送的完整例子
2006/10/09 PHP
Apache2 httpd.conf 中文版
2006/11/17 PHP
PHP 5.3新增魔术方法__invoke概述
2014/07/23 PHP
PHP生成条形图的方法
2014/12/10 PHP
php简单压缩css样式示例
2016/09/22 PHP
php设计模式之抽象工厂模式分析【星际争霸游戏案例】
2020/01/23 PHP
jQuery分组选择器用法实例
2014/12/23 Javascript
window.location.reload 刷新使用分析(去对话框)
2015/11/11 Javascript
神奇!js+CSS+DIV实现文字颜色渐变效果
2016/03/16 Javascript
AngularJS入门教程之AngularJS模型
2016/04/18 Javascript
JavaScript比较当前时间是否在指定时间段内的方法
2016/08/02 Javascript
Vue.js路由组件vue-router使用方法详解
2016/12/02 Javascript
使用jsonp实现跨域获取数据实例讲解
2016/12/25 Javascript
js获取地址栏中传递的参数(两种方法)
2017/02/08 Javascript
基于vue.js无缝滚动效果
2018/01/25 Javascript
vue.js 实现a标签href里添加参数
2019/11/12 Javascript
浅析TypeScript 命名空间
2020/03/19 Javascript
javascript实现点击按钮切换轮播图功能
2020/09/23 Javascript
Python中的迭代器与生成器高级用法解析
2016/06/28 Python
python 计算一个字符串中所有数字的和实例
2019/06/11 Python
Python使用PyQt5/PySide2编写一个极简的音乐播放器功能
2020/02/07 Python
完美解决Django2.0中models下的ForeignKey()问题
2020/05/19 Python
利用CSS3实现折角效果实例源码
2016/09/28 HTML / CSS
介绍一下Java中的Class类
2015/04/10 面试题
北京某公司的.net笔试题
2014/03/20 面试题
网游商务专员求职信
2013/10/15 职场文书
党校学习思想汇报
2014/01/06 职场文书
软件部经理岗位职责范本
2014/02/25 职场文书
新年抽奖获奖感言
2014/03/02 职场文书
付款委托书范本
2014/04/04 职场文书
村委会换届选举方案
2014/05/03 职场文书
保护环境倡议书100字
2014/05/19 职场文书
民事赔偿协议书
2014/11/02 职场文书
新闻通讯稿模板
2015/07/22 职场文书
2016同学毕业寄语大全
2015/12/04 职场文书
Java各种比较对象的方式的对比总结
2021/06/20 Java/Android