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中的非阻塞方法介绍
Jun 05 NodeJs
你一定会收藏的Nodejs代码片段
Feb 04 NodeJs
nodejs制作爬虫实现批量下载图片
May 19 NodeJs
浅谈nodejs中的类定义和继承的套路
Jul 26 NodeJs
NodeJS简单实现WebSocket功能示例
Feb 10 NodeJs
NodeJs搭建本地服务器之使用手机访问的实例讲解
May 12 NodeJs
Linux Centos7.2下安装nodejs&amp;npm配置全局路径的教程
May 15 NodeJs
详解NodeJs项目 CentOs linux服务器线上部署
Sep 16 NodeJs
Nodejs实现图片上传、压缩预览、定时删除功能
Oct 25 NodeJs
nodejs脚本centos开机启动实操方法
Mar 04 NodeJs
NodeJS开发人员常见五个错误理解
Oct 14 NodeJs
分享node.js实现简单登录注册的具体代码
Apr 26 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
dedecms集成财付通支付接口
2014/12/28 PHP
详谈symfony window下的安装 安装时候出现的问题以及解决方法
2017/09/28 PHP
基于JQuery的密码强度验证代码
2010/03/01 Javascript
javascript 节点排序 2
2011/01/31 Javascript
JS 按钮点击触发(兼容IE、火狐)
2013/08/07 Javascript
jQuery 1.9使用$.support替代$.browser的使用方法
2014/05/27 Javascript
jQuery常用操作方法及常用函数总结
2014/06/19 Javascript
关于javascript模块加载技术的一些思考
2014/11/28 Javascript
NodeJS学习笔记之Http模块
2015/01/13 NodeJs
JavaScript将Web页面内容导出到Word及Excel的方法
2015/02/13 Javascript
JavaScript中的slice()方法使用详解
2015/06/06 Javascript
JS中mouseover和mouseout多次触发问题如何解决
2016/06/06 Javascript
微信小程序本作用域下调用全局JS详解及实例
2017/02/22 Javascript
Vue.js基础学习之class与样式绑定
2017/03/20 Javascript
深入理解Vue Computed计算属性原理
2018/05/29 Javascript
Vue瀑布流插件的使用示例
2018/09/19 Javascript
基于Echarts图表在div动态切换时不显示的解决方式
2020/07/20 Javascript
Python即时网络爬虫项目启动说明详解
2018/02/23 Python
pandas求两个表格不相交的集合方法
2018/12/08 Python
Python操作rabbitMQ的示例代码
2019/03/19 Python
使用Python快乐学数学Github万星神器Manim简介
2019/08/07 Python
使用pygame写一个古诗词填空通关游戏
2019/12/03 Python
python的json中方法及jsonpath模块用法分析
2019/12/06 Python
pyinstaller打包单文件时--uac-admin选项不起作用怎么办
2020/04/15 Python
大韩航空官方网站:Korean Air
2017/10/25 全球购物
大学生水文观测实习自我鉴定
2013/09/29 职场文书
党校学习思想汇报
2014/01/06 职场文书
幼儿园教师工作制度
2014/01/22 职场文书
2014年五四青年节演讲比赛方案
2014/04/22 职场文书
关于颐和园的导游词
2015/01/30 职场文书
业务员岗位职责范本
2015/04/03 职场文书
行政人事专员岗位职责
2015/04/07 职场文书
2015年社区党务工作总结
2015/04/21 职场文书
五一放假通知怎么写
2015/08/18 职场文书
小学生红领巾广播稿
2015/08/19 职场文书
初中信息技术教学反思
2016/02/16 职场文书