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、Python写的一个简易HTTP静态文件服务器
Jul 18 NodeJs
浅谈NodeJS中require路径问题
May 07 NodeJs
用NodeJS实现批量查询地理位置的经纬度接口
Aug 16 NodeJs
nodejs实例解析(输出hello world)
Jan 03 NodeJs
nodejs个人博客开发第一步 准备工作
Apr 12 NodeJs
NodeJs模拟登陆正方教务
Apr 28 NodeJs
nodeJS实现路由功能实例代码
Jun 08 NodeJs
详解HTTPS 的原理和 NodeJS 的实现
Jul 04 NodeJs
nodejs搭建本地服务器轻松解决跨域问题
Mar 21 NodeJs
PHPStorm中如何对nodejs项目进行单元测试详解
Feb 28 NodeJs
Nodejs技巧之Exceljs表格操作用法示例
Nov 06 NodeJs
Node.js实现爬取网站图片的示例代码
Apr 04 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的数据库抽象层函数库
2006/10/09 PHP
IIS6.0+PHP5.x+MySQL5.x+Zend3.0x+GD+phpMyAdmin2.8x通用安装实例(已经完成)
2006/12/06 PHP
php数字每三位加逗号的功能函数
2015/10/22 PHP
PHP实现的蚂蚁爬杆路径算法代码
2015/12/03 PHP
js滚动条多种样式,推荐
2007/02/05 Javascript
不安全的常用的js写法
2009/09/15 Javascript
js中如何复制一个对象并获取其所有属性和属性对应的值
2013/10/24 Javascript
jQuery(js)获取文字宽度(显示长度)示例代码
2013/12/31 Javascript
使用javascript实现雪花飘落的效果
2015/01/13 Javascript
详细分析JavaScript变量类型
2015/07/08 Javascript
JQuery核心函数是什么及使用方法介绍
2016/05/03 Javascript
详解angular中通过$location获取路径(参数)的写法
2017/03/21 Javascript
vue中的非父子间的通讯问题简单的实例代码
2017/07/19 Javascript
Angular4学习笔记之根模块与Ng模块
2017/09/09 Javascript
js删除数组中某几项的方法总结
2019/01/16 Javascript
VUE搭建手机商城心得和遇到的坑
2019/02/21 Javascript
ES6小技巧之代替lodash
2019/06/07 Javascript
python和shell变量互相传递的几种方法
2013/11/20 Python
Python实现拷贝多个文件到同一目录的方法
2016/09/19 Python
Django中日期处理注意事项与自定义时间格式转换详解
2018/08/06 Python
在Python中关于使用os模块遍历目录的实现方法
2019/01/03 Python
Python 实现大整数乘法算法的示例代码
2019/09/17 Python
Python进程的通信Queue、Pipe实例分析
2020/03/30 Python
Python实现aes加密解密多种方法解析
2020/05/15 Python
丝芙兰中国官方商城:SEPHORA中国
2018/01/10 全球购物
La Senza官网:北美顶尖性感内衣品牌
2018/08/03 全球购物
C/C++程序员常见面试题一
2012/12/08 面试题
中式面点餐厅创业计划书
2014/01/29 职场文书
文科毕业生自荐书范文
2014/04/17 职场文书
志愿者爱心公益活动策划方案
2014/09/15 职场文书
离婚协议书怎么写(范本参考)
2014/09/30 职场文书
学校感恩节活动策划方案
2014/10/06 职场文书
年会邀请函范文
2015/01/30 职场文书
邀请函的格式
2015/01/30 职场文书
公司晚会主持词
2019/04/17 职场文书
MySQL如何解决幻读问题
2021/08/07 MySQL