Nodejs中解决cluster模块的多进程如何共享数据问题

Nodejs中解决cluster模块的多进程如何共享数据问题

 更新时间:2016年11月10日 08:44:20   作者:黄明恩  

 

本篇文章主要介绍了Nodejs中解决cluster模块的多进程如何共享数据问题,有需要的可以了解一下。

 

前述

nodejs在v0.6.x之后增加了一个模块cluster用于实现多进程,利用child_process模块来创建和管理进程,增加程序在多核CPU机器上的性能表现。本文将介绍利用cluster模块创建的多线程如何共享数据的问题。

进程间数据共享

首先举个简单的例子,代码如下:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

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);

}

运行结果如下: 

为什么我们在主进程代码块以及子进程代码块之外来声明的变量不应该是全局变量么?答案是否定的。因为每个进程在内存都有各自的区域,因此data++操作是在各自的区域内进行的,也就是说变量data没被共享。那么怎么来在各进程之间共享数据呢?来看下面的代码:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

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' });

}

运行结果如下:

因此如果需要共享数据,需要在进程间使用消息通知来达到这个目的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

转载自:https://www.jb51.net/article/96929.htm

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值