node cluster模块的使用和测试
首先安装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模块的使用和测试的更多相关文章
- node cluster模块,仿多线程并发调用,
worker.js var cluster = require('cluster')function fibo(n) { return n == 0 ? 0 : n > 1 ? fibo(n - ...
- Node.js的cluster模块——Web后端多进程服务
众所周知,Node.js是单线程的,一个单独的Node.js进程无法充分利用多核.Node.js从v0.6.0开始,新增cluster模块,让Node.js开发Web服务时,很方便的做到充分利用多核机 ...
- 【nodejs原理&源码赏析(4)】深度剖析cluster模块源码与node.js多进程(上)
[摘要] 集群管理模块cluster浅析 示例代码托管在:http://www.github.com/dashnowords/blogs 一. 概述 cluster模块是node.js中用于实现和管理 ...
- 【nodejs原理&源码赏析(4)】深度剖析cluster模块源码与node.js多进程(上)
目录 一. 概述 二. 线程与进程 三. cluster模块源码解析 3.1 起步 3.2 入口 3.3 主进程模块master.js 3.4 子进程模块child.js 四. 小结 示例代码托管在: ...
- 【nodejs原理&源码赏析(6)】深度剖析cluster模块源码与node.js多进程(下)
[摘要] cluster模块详解 示例代码托管在:http://www.github.com/dashnowords/blogs 阅读本章需要先阅读本系列前两章内容预热一下. 一. 引言 前两篇博文中 ...
- 【nodejs原理&源码赏析(6)】深度剖析cluster模块源码与node.js多进程(下)
目录 一. 引言 二.server.listen方法 三.cluster._getServer( )方法 四.跨进程通讯工具方法Utils 五.act:queryServer消息 六.轮询调度Roun ...
- Node.js模块
每一个Node.js都是一个Node.js模块,包括JavaScript文件(.js).JSON文本文件(.json)和二进制模块文件(.node). mymodul.js function Hell ...
- Node.cluster
nodejs是一个单进程单线程的引擎,只能利用到单个cpu进行计算,面对当今服务器性能的提高,cpu的利用率显然对node应有的性能大打折扣,面对这个问题,cluster应运而生. cluster介绍 ...
- Nodejs cluster模块深入探究
由表及里 HTTP服务器用于响应来自客户端的请求,当客户端请求数逐渐增大时服务端的处理机制有多种,如tomcat的多线程.nginx的事件循环等.而对于node而言,由于其也采用事件循环和异步I/O机 ...
随机推荐
- C#实战Microsoft Messaging Queue(MSMQ)消息队列(干货)<转>
前言 在使用MSMQ之前,我们需要自行安装消息队列组件!(具体安装方法大家自己搜一下吧) 采用MSMQ带来的好处是:由于是异步通信,无论是发送方还是接收方都不用等待对方返回成功消息,就可以执行余下的代 ...
- 【Mysql】Navicat For Mysql快捷键
ctrl+q 打开查询窗口ctrl+/ 注释sql语句ctrl+shift +/ 解除注释ctrl+r 运行查询窗口的sql语句ctrl+shift+r 只运行选中的sql语句F6 打开一个mysql ...
- WebSocket和SocketIO总结
1.WebSocket是什么? WebScoket是一种让客户端和服务器之间能进行双向实时通信的技术.它是HTML最新标准HTML5的一个协议规范,本质上是个基于TCP的协议,它通过HTTP/HTTP ...
- 解决ubuntu无法进入unity模式
终端输入如下命令: 1.sudo add-apt-repository ppa:gnome3-team/gnome3 2.sudo apt-get update 3.sudo apt-get inst ...
- Unity3d 快捷键
Windows系统Unity3D中的快捷键 组合键 键 功能 File 文件 Ctrl N New Scene 新建场景 Ctrl O Open Scene 打开场景 Ctrl S Sav ...
- idangerous swiper
最近使用Swipe.js,发现中文的资料很少,试着翻译了一下.能力有限,翻译难免错漏,欢迎指出,多谢! 翻译自:http://www.idangero.us/sliders/swiper/api.ph ...
- VC++MFC对话框程序中给对话添加背景图片
VC对话框怎么显示背景图片呢.在MFC中实现背景图片,不像C#应用程序那么简单.今天就和朋友们说说如何在VC界面中设置背景图片 ^_^ 工具/原料 Visual C++ 2010 方法一:用Pic ...
- mysql中的乐观锁和悲观锁
mysql中的乐观锁和悲观锁的简介以及如何简单运用. 关于mysql中的乐观锁和悲观锁面试的时候被问到的概率还是比较大的. mysql的悲观锁: 其实理解起来非常简单,当数据被外界修改持保守态度,包括 ...
- 记录-移动端网页触摸内容滑动js插件
需求: 在webapp中需要左右滑动手机,移动主页的轮播图.也可用在引导页(欢迎页)的大图左右滑动 可用: 百度:swiper插件 在项目中导入插件,这里只有部分代码,具体百度swiper <l ...
- nginx + uWSGI 为 django 提供高并发
django 的并发能力真的是令人担忧,这里就使用 nginx + uwsgi 提供高并发 nginx 的并发能力超高,单台并发能力过万(这个也不是绝对),在纯静态的 web 服务中更是突出其优越的地 ...