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实现多人同时在线移动鼠标的小游戏分享
Dec 06 NodeJs
nodejs的压缩文件模块archiver用法示例
Jan 18 NodeJs
NodeJS遍历文件生产文件列表功能示例
Jan 22 NodeJs
NodeJS基础API搭建服务器详细过程记录
Apr 01 NodeJs
Nodejs 复制文件/文件夹的方法
Aug 24 NodeJs
Nodejs连接mysql并实现增、删、改、查操作的方法详解
Jan 04 NodeJs
NodeJs 文件系统操作模块fs使用方法详解
Nov 26 NodeJs
Nodejs中获取当前函数被调用的行数及文件名详解
Dec 12 NodeJs
NodeJs入门教程之定时器和队列
Mar 08 NodeJs
使用nodejs分离html文件里的js和css详解
Apr 12 NodeJs
nodejs使用node-xlsx生成excel的方法示例
Aug 22 NodeJs
nodejs语言实现验证码生成功能的示例代码
Oct 13 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
风味层面去分析咖啡油脂
2021/03/03 咖啡文化
解析php二分法查找数组是否包含某一元素
2013/05/23 PHP
PHP遍历目录并返回统计目录大小
2014/06/09 PHP
ThinkPHP在新浪SAE平台的部署实例
2014/10/31 PHP
微信公众平台开发关注及取消关注事件的方法
2014/12/23 PHP
php启用sphinx全文搜索的实现方法
2014/12/24 PHP
php插入含有特殊符号数据的处理方法
2016/11/24 PHP
javascript实现仿腾讯游戏选择
2015/05/14 Javascript
javascript获取系统当前时间的方法
2015/11/19 Javascript
JavaScript中setTimeout和setInterval函数的传参及调用
2016/03/11 Javascript
JavaScript的函数式编程基础指南
2016/03/19 Javascript
JS &amp; JQuery 动态添加 select option
2016/06/08 Javascript
js时间比较 js计算时间差的简单实现方法
2016/08/26 Javascript
nodejs redis 发布订阅机制封装实现方法及实例代码
2016/12/15 NodeJs
jQuery实现贪吃蛇小游戏(附源码下载)
2017/03/04 Javascript
js事件委托和事件代理案例分享
2017/07/25 Javascript
微信小程序云开发之云函数详解
2019/05/16 Javascript
React学习之JSX与react事件实例分析
2020/01/06 Javascript
微信小程序仿通讯录功能
2020/04/09 Javascript
jQuery实现图片切换效果
2020/10/19 jQuery
解决vue项目中出现Invalid Host header的问题
2020/11/17 Javascript
[13:39]2014 DOTA2华西杯精英邀请赛 5 25 NewBee VS DK第一场
2014/05/26 DOTA
跟老齐学Python之集合(set)
2014/09/24 Python
初步介绍Python中的pydoc模块和distutils模块
2015/04/13 Python
Python实现定时执行任务的三种方式简单示例
2019/03/30 Python
基于python cut和qcut的用法及区别详解
2019/11/22 Python
python实现多进程按序号批量修改文件名的方法示例
2019/12/30 Python
利用python绘制正态分布曲线
2021/01/04 Python
Html5游戏开发之乒乓Ping Pong游戏示例(二)
2013/01/21 HTML / CSS
HTML5中判断横屏竖屏的方法(移动端)
2016/08/04 HTML / CSS
HTML5 drag和drop具体使用详解
2021/01/18 HTML / CSS
定义一结构体变量,用其表示点坐标,并输入两点坐标,求两点之间的距离
2015/08/17 面试题
啤酒销售实习自我鉴定
2013/09/24 职场文书
生产部主管岗位职责
2014/01/06 职场文书
工作疏忽、懈怠的检讨书
2014/09/11 职场文书
2015年招生工作总结
2015/05/04 职场文书