zoukankan      html  css  js  c++  java
  • Nodejs中cluster模块的多进程共享数据问题

    前述

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

      运行结果如下:

      为什么我们在主进程代码块以及子进程代码块之外来声明的变量不应该是全局变量么?答案是否定的。因为每个进程在内存都有各自的区域,因此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' }); 
    } 

      运行结果如下:

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

    工欲善其事必先利其器
  • 相关阅读:
    [BZOJ2763] [JLOI2011] 飞行路线
    [BZOJ4033] [HAOI2015] 树上染色
    [BZOJ2565] 最长双回文串
    [luogu5048] [Ynoi2019模拟赛] Yuno loves sqrt technology III
    又犯了低级错误了
    Win10系统无法使用小米手机的远程管理功能
    DevExpress破解和消除弹出框问题
    重写导致的问题
    EXCEL统计不重复值的数量
    C#中Button.DialogResult属性
  • 原文地址:https://www.cnblogs.com/CodeGuy/p/3101312.html
Copyright © 2011-2022 走看看