文章目录
  1. 1. Nodejs中cluster模块的多进程共享数据问题 - 推酷
  2. 2. Nodejs中cluster模块的多进程共享数据问题
    1. 2.0.1. 前述
    2. 2.0.2. 进程间数据共享

Nodejs中cluster模块的多进程共享数据问题 - 推酷

nodejs cluster

Nodejs中cluster模块的多进程共享数据问题

前述

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

进程间数据共享

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

 cluster = require('cluster' data = ;这里定义数据不会被所有进程共享,各个进程有各自的内存区域 
 (cluster.isMaster) { 
     numCPUs = require().cpus().length; 
     ( i = ; i < numCPUs; i++ worker = cluster.fork(); 
    }    
    data++; 
    console.log('DATA VALUE in MainProcess: %d ' , data);
}  { 子进程,会被调用numCPUs次 
    data++; 
    console.log('DATA VALUE in ChildProcess %d: %d ' cluster.worker.id, data);
}

运行结果如下:

eIvqaa-png!web.png

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

 cluster = require('cluster' http = require('http' (cluster.isMaster) { 
   numCPUs = require().cpus().length; 
   data =  启动多个进程. 
   ( i = ; i < numCPUs; i++增加一个进程 
     worker_process = cluster.fork(); 
    侦听子进程的message事件 
    worker_process.on('message', function(msg) { 
       (msg.cmd && msg.cmd == 'notifyRequest') { 
        data++; 
        console.log('DATA VALUE : %d ', data);
      } 
    }); 
  } 
}  { 
    process.send({ cmd: 'notifyRequest'

运行结果如下:

yuUfiy-png!web.png

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

如何充分利用多核多线程CPU?

  1. nodejs编码

     由于nodejs的程序是单线程方式运行的,不能充分利用多核多线程的CPU的服务器,所以nodejs提供了          child_process和cluster的解决方案,原理是借助web Workers的原理,开启分发线程的方式实现消息传递。相当于内部实现了一个集群。这是通过nodejs编码的方式去实现

  1. PM2 实现

    
      这个就不多讲了,利用PM2部署应用程序,PM2会根据cpu的核数自动部署实例数:线程数*cpu核数 

文章目录
  1. 1. Nodejs中cluster模块的多进程共享数据问题 - 推酷
  2. 2. Nodejs中cluster模块的多进程共享数据问题
    1. 2.0.1. 前述
    2. 2.0.2. 进程间数据共享