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中Buffer模块详解
Jan 07 NodeJs
NodeJS学习笔记之Connect中间件模块(一)
Jan 27 NodeJs
NodeJS中利用Promise来封装异步函数
Feb 25 NodeJs
Nodejs关于gzip/deflate压缩详解
Mar 04 NodeJs
Nodejs获取网络数据并生成Excel表格
Mar 31 NodeJs
nodejs模块nodemailer基本使用-邮件发送示例(支持附件)
Mar 28 NodeJs
使用 NodeJS+Express 开发服务端的简单介绍
Apr 07 NodeJs
nodejs socket实现的服务端和客户端功能示例
Jun 02 NodeJs
nodejs body-parser 解析post数据实例
Jul 26 NodeJs
详解nodejs通过代理(proxy)发送http请求(request)
Sep 22 NodeJs
nodejs超出最大的调用栈错误问题
Dec 27 NodeJs
详解NodeJS模块化
Jun 15 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正则表达式中的非贪婪模式匹配的使用
2014/11/25 PHP
php抽象类用法实例分析
2015/07/07 PHP
PHP call_user_func和call_user_func_array函数的简单理解与应用分析
2019/11/25 PHP
jsvascript图像处理—(计算机视觉应用)图像金字塔
2013/01/15 Javascript
JavaScript设计模式之单件模式介绍
2014/12/28 Javascript
JavaScript前端图片加载管理器imagepool使用详解
2014/12/29 Javascript
Javascript中的getUTCDay()方法使用详解
2015/06/10 Javascript
JavaScript获取浏览器信息的方法
2015/11/20 Javascript
javascript垃圾收集机制的原理分析
2016/12/08 Javascript
jQuery插件zTree实现的基本树与节点获取操作示例
2017/03/08 Javascript
vue一步步实现alert功能
2017/07/05 Javascript
JS对象序列化成json数据和json数据转化为JS对象的代码
2017/08/23 Javascript
vue实现自定义日期组件功能的实例代码
2018/11/06 Javascript
详解Puppeteer前端自动化测试实践
2019/02/21 Javascript
JS左右无缝轮播功能完整实例
2019/05/16 Javascript
JS实现烟花爆炸效果
2020/03/10 Javascript
JavaScript 声明私有变量的两种方式
2021/02/05 Javascript
Python脚本完成post接口测试的实例
2018/12/17 Python
python批量创建指定名称的文件夹
2019/03/21 Python
python2与python3爬虫中get与post对比解析
2019/09/18 Python
Python Django2.0集成Celery4.1教程
2019/11/19 Python
Python3 获取文件属性的方式(时间、大小等)
2020/03/12 Python
django自带的权限管理Permission用法说明
2020/05/13 Python
python中pdb模块实例用法
2021/01/15 Python
美国著名的婴儿学步鞋老品牌:Robeez
2016/08/20 全球购物
金宝贝童装官网:Gymboree
2016/08/31 全球购物
什么是继承
2013/12/07 面试题
高中毕业自我鉴定
2013/12/22 职场文书
《一个中国孩子的呼声》教学反思
2014/02/12 职场文书
消防安全员岗位职责
2014/03/10 职场文书
希特勒的演讲稿
2014/05/23 职场文书
七一建党节演讲稿
2014/09/11 职场文书
2014年军人思想汇报范文
2014/10/12 职场文书
小学教师个人总结
2015/02/05 职场文书
2015年法务工作总结范文
2015/05/23 职场文书
HTML页面中使两个div并排显示的实现
2022/05/15 HTML / CSS