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简单实现中英文翻译
May 04 NodeJs
NodeJS远程代码执行
Aug 28 NodeJs
nodejs 实现钉钉ISV接入的加密解密方法
Jan 16 NodeJs
详谈Angular路由与Nodejs路由的区别
Mar 05 NodeJs
nodejs个人博客开发第四步 数据模型
Apr 12 NodeJs
nodejs multer实现文件上传与下载
May 10 NodeJs
详解使用nodeJs安装Vue-cli
May 17 NodeJs
mac下的nodejs环境安装的步骤
May 24 NodeJs
基于nodejs实现微信支付功能
Dec 20 NodeJs
原生nodejs使用websocket代码分享
Apr 07 NodeJs
详解nodejs 开发企业微信第三方应用入门教程
Mar 12 NodeJs
nodejs+express最简易的连接数据库的方法
Dec 23 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
mysql_num_rows VS COUNT 效率问题分析
2011/04/23 PHP
php采集文章中的图片获取替换到本地(实现代码)
2013/07/08 PHP
浅谈本地WAMP环境的搭建
2015/05/13 PHP
PHP代码实现表单数据验证类
2015/07/28 PHP
php读取本地json文件的实例
2018/03/07 PHP
JavaScript 实现简单的倒计时弹窗DEMO附图
2014/03/05 Javascript
IE6 hack for js 集锦
2014/09/23 Javascript
AngularJS自定义指令详解(有分页插件代码)
2017/06/12 Javascript
详解Vue爬坑之vuex初识
2017/06/14 Javascript
Easy UI动态树点击文字实现展开关闭功能
2017/09/30 Javascript
JS函数节流和函数防抖问题分析
2017/12/18 Javascript
详解vue-cli 本地开发mock数据使用方法
2018/05/29 Javascript
微信小程序scroll-view实现滚动穿透和阻止滚动的方法
2018/08/20 Javascript
从零撸一个pc端vue的ui组件库( 计数器组件 )
2019/08/08 Javascript
jQuery高级编程之js对象、json与ajax用法实例分析
2019/11/01 jQuery
npm ci命令的基本使用方法
2020/09/20 Javascript
python用来获得图片exif信息的库实例分析
2015/03/16 Python
Python 编码Basic Auth使用方法简单实例
2017/05/25 Python
django缓存配置的几种方法详解
2018/07/16 Python
Python实现简单的用户交互方法详解
2018/09/25 Python
对Python中的条件判断、循环以及循环的终止方法详解
2019/02/08 Python
python利用wx实现界面按钮和按钮监听和字体改变的方法
2019/07/17 Python
Python企业编码生成系统之系统主要函数设计详解
2019/07/26 Python
python实现WebSocket服务端过程解析
2019/10/18 Python
Django自带的用户验证系统实现
2020/12/18 Python
Python中过滤字符串列表的方法
2020/12/22 Python
ABOUT YOU匈牙利:500个最受欢迎的时尚品牌
2019/07/19 全球购物
《分一分》教学反思
2014/04/13 职场文书
社会实践先进工作者事迹材料
2014/05/06 职场文书
2014年安全生产责任书
2014/07/22 职场文书
初中生考试作弊检讨书
2014/12/14 职场文书
导游词欢迎词
2015/02/02 职场文书
关于调整工作时间的通知
2015/04/24 职场文书
2015年村计划生育工作总结
2015/04/28 职场文书
入门学习Go的基本语法
2021/07/07 Golang
Vue3中的Refs和Ref详情
2021/11/11 Vue.js