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 相关文章推荐
golang、python、php、c++、c、java、Nodejs性能对比
Mar 12 NodeJs
Nodejs进程管理模块forever详解
Jun 01 NodeJs
基于NodeJS的前后端分离的思考与实践(三)轻量级的接口配置建模框架
Sep 26 NodeJs
NodeJS制作爬虫全过程
Dec 22 NodeJs
nodeJs爬虫获取数据简单实现代码
Mar 29 NodeJs
nodeJS删除文件方法示例
Dec 25 NodeJs
win系统下nodejs环境安装配置
May 04 NodeJs
nodejs操作mongodb的填删改查模块的制作及引入实例
Jan 02 NodeJs
nodejs前端模板引擎swig入门详解
May 15 NodeJs
NodeJs 文件系统操作模块fs使用方法详解
Nov 26 NodeJs
nodejs基础之多进程实例详解
Dec 27 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
PHP面向对象程序设计组合模式与装饰模式详解
2016/12/02 PHP
详解PHP防止直接访问.php 文件的实现方法
2017/07/28 PHP
javascript 写类方式之八
2009/07/05 Javascript
JavaScript 学习笔记(十四) 正则表达式
2010/01/22 Javascript
jQuery版Tab标签切换
2011/03/16 Javascript
Jquery获取元素的父容器对象示例代码
2014/02/10 Javascript
jQuery通过Ajax返回JSON数据
2015/04/28 Javascript
4种JavaScript实现简单tab选项卡切换的方法
2016/01/06 Javascript
浅谈JavaScript对象的创建方式
2016/06/13 Javascript
微信小程序开发(二)图片上传+服务端接收详解
2017/01/11 Javascript
JS常见简单正则表达式验证功能小结【手机,地址,企业税号,金额,身份证等】
2017/01/22 Javascript
WebPack配置vue多页面的技巧
2018/05/15 Javascript
layui use 定义js外部引用函数的方法
2019/09/26 Javascript
Vue-cli3项目引入Typescript的实现方法
2019/10/18 Javascript
JS数组方法shift()、unshift()用法实例分析
2020/01/18 Javascript
vue 子组件修改data或调用操作
2020/08/07 Javascript
Python书单 不将就
2017/07/11 Python
机器学习10大经典算法详解
2017/12/07 Python
浅谈配置OpenCV3 + Python3的简易方法(macOS)
2018/04/02 Python
python3中获取文件当前绝对路径的两种方法
2018/04/26 Python
详解Python二维数组与三维数组切片的方法
2019/07/18 Python
python打印异常信息的两种实现方式
2019/12/24 Python
python模拟哔哩哔哩滑块登入验证的实现
2020/04/24 Python
通过实例简单了解Python sys.argv[]使用方法
2020/08/04 Python
sublime3之内网安装python插件Anaconda的流程
2020/11/10 Python
PyTorch中的拷贝与就地操作详解
2020/12/09 Python
利用python实现汉诺塔游戏
2021/03/01 Python
阿迪达斯印尼官方网站:adidas印尼
2020/02/10 全球购物
皇家阿尔伯特瓷器美国官网:Royal Albert美国
2020/02/16 全球购物
不假外出检讨书
2014/01/27 职场文书
实习生求职自荐信
2014/02/07 职场文书
简易离婚协议书范本
2014/10/24 职场文书
锅炉工岗位职责
2015/02/13 职场文书
公司趣味运动会开幕词
2016/03/04 职场文书
Python Pycharm虚拟下百度飞浆PaddleX安装报错问题及处理方法(亲测100%有效)
2021/05/24 Python
springboot应用服务启动事件的监听实现
2022/04/06 Java/Android