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 相关文章推荐
使用forever管理nodejs应用教程
Jun 03 NodeJs
Nodejs sublime text 3安装与配置
Jun 19 NodeJs
nodeJs爬虫获取数据简单实现代码
Mar 29 NodeJs
nodeJS(express4.x)+vue(vue-cli)构建前后端分离实例(带跨域)
Jul 05 NodeJs
nodejs使用redis作为缓存介质实现的封装缓存类示例
Feb 07 NodeJs
nodeJS服务器的创建和重新启动的实现方法
May 12 NodeJs
nodeJs爬虫的技术点总结
May 13 NodeJs
nodejs中express入门和基础知识点学习
Sep 13 NodeJs
nodejs实现范围请求的实现代码
Oct 12 NodeJs
nodejs npm错误Error:UNKNOWN:unknown error,mkdir 'D:\Develop\nodejs\node_global'at Error
Mar 02 NodeJs
Nodejs中的require函数的具体使用方法
Apr 02 NodeJs
详解nodejs内置模块
May 06 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
输出控制类
2006/10/09 PHP
CodeIgniter php mvc框架 中国网站
2008/05/26 PHP
PHP 将图片按创建时间进行分类存储的实现代码
2010/01/05 PHP
php检测用户是否用手机(Mobile)访问网站的类
2014/01/09 PHP
mac下Apache + MySql + PHP搭建网站开发环境
2014/06/02 PHP
php绘制圆形的方法
2015/01/24 PHP
护卫神php套件 php版本升级方法(php5.5.24)
2015/05/10 PHP
PHP 输出缓冲控制(Output Control)详解
2016/08/25 PHP
浅析jquery的作用与优势
2013/12/02 Javascript
jquery移除、绑定、触发元素事件使用示例详解
2014/04/10 Javascript
js实现飞入星星特效代码
2014/10/17 Javascript
浅谈JavaScript 框架分类
2014/11/10 Javascript
js实现上传图片预览的方法
2015/02/09 Javascript
JavaScript中的some()方法使用详解
2015/06/09 Javascript
如何通过非数字与字符的方式实现PHP WebShell详解
2017/07/02 Javascript
jQuery获取复选框选中的当前行的某个字段的值
2017/09/15 jQuery
使用vue2.6实现抖音【时间轮盘】屏保效果附源码
2019/04/24 Javascript
使用npm命令提示: 'npm' 不是内部或外部命令,也不是可运行的程序的处理方法
2020/05/14 Javascript
Vue将props值实时传递 并可修改的操作
2020/08/09 Javascript
微信小程序实现列表左右滑动
2020/11/19 Javascript
[02:43]DOTA2英雄基础教程 德鲁伊
2014/01/13 DOTA
用Python解决计数原理问题的方法
2016/08/04 Python
python2.7的编码问题与解决方法
2016/10/04 Python
回调函数的意义以及python实现实例
2017/06/20 Python
Python中字典的浅拷贝与深拷贝用法实例分析
2018/01/02 Python
flask入门之表单的实现
2018/07/18 Python
详解python statistics模块及函数用法
2019/10/27 Python
详解python实现可视化的MD5、sha256哈希加密小工具
2020/09/14 Python
localStorage 设置过期时间的方法实现
2018/12/21 HTML / CSS
薪酬专员岗位职责
2014/02/18 职场文书
献爱心倡议书
2014/04/14 职场文书
离婚协议书怎么写的
2014/12/14 职场文书
2015元旦感言
2015/12/09 职场文书
2016护理专业求职自荐书
2016/01/28 职场文书
Java常用函数式接口总结
2021/06/29 Java/Android
详解Spring Security中的HttpBasic登录验证模式
2022/03/17 Java/Android