首先安装async包

用到的有http、cluster包

http和cluster都会node自带的包,无需安装

1:创建cluster.js,代码如下,更具cpu创建多个进程

var cluster = require("cluster");
var http = require("http");
var numCPUs = require('os').cpus().length;

if(cluster.isMaster){

console.log("[master] " + "start master......");

var data = 0;

for(var i=0; i<numCPUs; i++){

var work_process = cluster.fork();

}

cluster.on("listening", function(worker, address){

console.log("[master] " + "listening: worker "+worker.id + ", pid:"+worker.process.pid + ",Address:" + address.address + ":" + address.port);

});

cluster.on("exit", function(worker, code, signal){

console.log('worker ' + worker.process.pid + ' died');

});

}else{

http.createServer(function(req, res){

console.log("worker" + cluster.worker.id);

res.end("worker" + cluster.worker.id);

}).listen(30001);

}

执行该文件会看到有多个进程现在

2:创建httpClient.js用来请求刚才创建的30001端口的服务

var http = require("http");

var options = {

hostname: 'localhost',

port: 30001,

path: '/',

method: 'GET'

};

module.exports = function(callback){

var req = http.request(options, function(res) {

res.on('data', function (chunk) {

callback(chunk.toString());

});

});

req.on('error', function(e) {

console.log('problem with request: ' + e.message);

});

req.end();

};

3:创建test.js测试同步跑多个请求,最后统计出各个进程走的请求数量

var async = require("async");
var httpClient = require("./httpClient");

var sum = 10;
var t = {"1":0, "2":0,"3":0, "4":0};
var c=0;

for(var i=0; i<sum; i++){
    async.series([
        function(cb){
            httpClient(function(str){
                if(str === "worker1")
                    t["1"] = parseInt(t["1"] || 0) + 1;
                if(str === "worker2")
                    t["2"] = parseInt(t["2"] || 0) + 1;
                if(str === "worker3")
                    t["3"] = parseInt(t["3"] || 0) + 1;
                if(str === "worker4")
                    t["4"] = parseInt(t["4"] || 0) + 1;
                cb();
            });
        }
    ], function(err, result){
        if(err){
            console.log(err);
        }
        c++;
        if(c == sum){
            console.log(t);
        }
    });
}

其中Express和cluster结合使用

创建clusterMaster.js

var http = require("http");
var cluster = require("cluster");
var numCPUs = require("os").cpus().length;

var workerList = [];
function createWorker(){
  var worker = cluster.fork();
  worker.on("message", function(data){
    console.log("the worker " + worker.id + "|" + worker.process.pid + " accept data: " + JSON.stringify(data));
    if(data.type && data.type === "broadcast"){
      workerList.forEach(function(wk){
        wk.send(data.body);
      });
    }
  });
  return worker;
};

if(cluster.isMaster){
  console.log("master process start...");
  for (var i = 0; i < numCPUs; i++) {
        workerList.push(createWorker());

  }
  cluster.on('listening',function(worker, address){
     console.log("A worker with #" + worker.id + " pid " + worker.process.pid +
        " is now connected to " + address.address + ":" + address.port);
  });
  cluster.on('exit', function(worker, code, signal) {
    console.log('worker ' + worker.process.pid + ' died');
    process.nextTick(function(){ cluster.fork(); });
  });
}else{
  require("./app.js");
}

以上cluster的功能就完成了,在app.js中添加监听message

process.on("message", function(data){
  console.log("the process %s accept data: %s", process.pid, JSON.stringify(data));
});

在路由方法这种可以实现发送消息到master,master在.on("message")中收到消息后做操作

process.send({type: "broadcast", body:"ssssssss"});

以上就是node下cluster和express结合实现合理利用CPU

node cluster模块的使用和测试的更多相关文章

  1. node cluster模块,仿多线程并发调用,

    worker.js var cluster = require('cluster')function fibo(n) { return n == 0 ? 0 : n > 1 ? fibo(n - ...

  2. Node.js的cluster模块——Web后端多进程服务

    众所周知,Node.js是单线程的,一个单独的Node.js进程无法充分利用多核.Node.js从v0.6.0开始,新增cluster模块,让Node.js开发Web服务时,很方便的做到充分利用多核机 ...

  3. 【nodejs原理&源码赏析(4)】深度剖析cluster模块源码与node.js多进程(上)

    [摘要] 集群管理模块cluster浅析 示例代码托管在:http://www.github.com/dashnowords/blogs 一. 概述 cluster模块是node.js中用于实现和管理 ...

  4. 【nodejs原理&源码赏析(4)】深度剖析cluster模块源码与node.js多进程(上)

    目录 一. 概述 二. 线程与进程 三. cluster模块源码解析 3.1 起步 3.2 入口 3.3 主进程模块master.js 3.4 子进程模块child.js 四. 小结 示例代码托管在: ...

  5. 【nodejs原理&源码赏析(6)】深度剖析cluster模块源码与node.js多进程(下)

    [摘要] cluster模块详解 示例代码托管在:http://www.github.com/dashnowords/blogs 阅读本章需要先阅读本系列前两章内容预热一下. 一. 引言 前两篇博文中 ...

  6. 【nodejs原理&源码赏析(6)】深度剖析cluster模块源码与node.js多进程(下)

    目录 一. 引言 二.server.listen方法 三.cluster._getServer( )方法 四.跨进程通讯工具方法Utils 五.act:queryServer消息 六.轮询调度Roun ...

  7. Node.js模块

    每一个Node.js都是一个Node.js模块,包括JavaScript文件(.js).JSON文本文件(.json)和二进制模块文件(.node). mymodul.js function Hell ...

  8. Node.cluster

    nodejs是一个单进程单线程的引擎,只能利用到单个cpu进行计算,面对当今服务器性能的提高,cpu的利用率显然对node应有的性能大打折扣,面对这个问题,cluster应运而生. cluster介绍 ...

  9. Nodejs cluster模块深入探究

    由表及里 HTTP服务器用于响应来自客户端的请求,当客户端请求数逐渐增大时服务端的处理机制有多种,如tomcat的多线程.nginx的事件循环等.而对于node而言,由于其也采用事件循环和异步I/O机 ...

随机推荐

  1. jquery简洁遮罩插件

    /************************** *Desc:提交操作时遮罩 *Argument:type=0 全屏遮 1局部遮 *Author:Zery-Zhang *Date:2014-09 ...

  2. 【Python + Selenium】之JS定位总结

    感谢:小琰子 Python+Selenium 脚本中的一些js的用法汇总: 1.滚动条 driver.set_window_size(500,500) js = "window.scroll ...

  3. js读取json包装的map集合

    后台 Map<String,Integer> map = new HashMap<>(); map.put("你好1", 1); map.put(" ...

  4. LINQ to Tree - A Generic Technique for Querying Tree-like Structures,包含遍历WPF VisualTree

    https://www.codeproject.com/Articles/62397/LINQ-to-Tree-A-Generic-Technique-for-Querying-Tree#generi ...

  5. unity shader 编辑器扩展类 ShaderGUI

    这应该unity5才出的新功能了,今天看文档时刚巧看到了,就来尝试了一下. 效果如图: shader 的编辑器扩展分为2种方法: 是通过UnityEditor下的ShaderGUI类来实现的,形式比较 ...

  6. Laravel开发:Laravel核心——Ioc服务容器源码解析(服务器绑定)

    服务容器的绑定 bind 绑定 bind 绑定是服务容器最常用的绑定方式,在 上一篇文章中我们讨论过,bind 的绑定有三种: 绑定自身 绑定闭包 绑定接口 今天,我们这篇文章主要从源码上讲解 Ioc ...

  7. html5中form表单新增属性以及改良的input标签元素的种类

    在HTML5中,表单新增了一些属性,input标签也有了更多的type类型,有些实现了js才能实现的特效,但目前有些浏览器不能全部支持.下面是一些h5在表单和input标签上的一些改动. <!D ...

  8. TP框架---thinkphp中ajax分页

    //点击类别后要显示的内容 public function pagechuli3()//这个方法的功能是根据ajax传过来的值查询数据,再将查询出来的数据返回到ajax,返回的默认是JSON类型. { ...

  9. java排序(整理)

    冒泡排序(面试都要问的算法) 一.基本思想:每次比较相邻的两个 元素,按需调整顺序   二.题目:要求将 12 35 99 18 76 这 5 个数进行从大到小排序   三.思路: (1)先比较第 1 ...

  10. 【python】-- 基本语法、循环

    数据类型 1.数字: int(整型) 在32位机器上,整数的位数为32位,取值范围为-2**31-2**31-1,即-2147483648-2147483647 在64位系统上,整数的位数为64位,取 ...