node.js使用cluster实现多进程
pm2 start app.js
1 fork() creates a new process by duplicating the calling process. The new process is referred to as the child process. The calling process is referred to as the parent process. 2 3 The child process and the parent process run in separate memory spaces. At the time of fork() both memory spaces have the same content. Memory writes, file mappings (mmap(2)), and unmappings (munmap(2)) performed by one of the processes do not affect the other.
1 const spawn = require('child_process').spawn; 2 const touch = spawn('touch',['spawn.js']); 3 4 touch.stdout.on('data', (data) => { 5 console.log(`stdout: ${data}`); 6 }); 7 8 touch.stderr.on('data', (data) => { 9 console.log(`stderr: ${data}`); 10 }); 11 12 touch.on('close', (code) => { 13 console.log(`child process exited with code $[code]`); 14 });
1 const childProcess = require('child_process'); 2 const ls = childProcess.exec('rm spawn.js', function (error, stdout, stderr) { 3 if (error) { 4 console.log(error.stack); 5 console.log('Error code: '+error.code); 6 } 7 console.log('Child Process STDOUT: '+stdout); 8 });
1 //master.js 2 const childProcess = require('child_process'); 3 const worker = childProcess.fork('worker.js'); 4 5 worker.on('message',function(mes){ 6 console.log(`from worder, message: ${mes}`); 7 }); 8 worker.send("this is master"); 9 10 //worker.js 11 process.on('message',function(mes){ 12 console.log(`from master, message: ${mes}`); 13 }); 14 process.send("this is worker");
1 from master, message: this is master 2 from worker, message: this is worker
1 //master.js 2 const net = require('net'); 3 const fork = require('child_process').fork; 4 5 var handle = net._createServerHandle('0.0.0.0', 3000); 6 7 for(var i=0;i<4;i++) { 8 fork('./worker').send({}, handle); 9 } 10 //worker.js 11 const net = require('net'); 12 //监听master发送过来的信息 13 process.on('message', function(m, handle) { 14 start(handle); 15 }); 16 17 var buf = 'hello nodejs'; ///返回信息 18 var res = ['HTTP/1.1 200 OK','content-length:'+buf.length].join('\r\n')+'\r\n\r\n'+buf; //嵌套字 19 20 function start(server) { 21 server.listen(); 22 var num=0; 23 //监听connection函数 24 server.onconnection = function(err,handle) { 25 num++; 26 console.log(`worker[${process.pid}]:${num}`); 27 var socket = new net.Socket({ 28 handle: handle 29 }); 30 socket.readable = socket.writable = true; 31 socket.end(res); 32 } 33 }
siege -c 100 -r 2 http://localhost:3000
1 worker[1182]:52 2 worker[1183]:42 3 worker[1184]:90 4 worker[1181]:16
1 //master 2 const net = require('net'); 3 const fork = require('child_process').fork; 4 5 var workers = []; 6 for (var i = 0; i < 4; i++) { 7 workers.push(fork('./worker')); 8 } 9 10 var handle = net._createServerHandle('0.0.0.0', 3000); 11 handle.listen(); 12 //将监听事件移到master中 13 handle.onconnection = function (err,handle) { 14 var worker = workers.pop(); //取出一个pop 15 worker.send({},handle); 16 workers.unshift(worker); //再放回取出的pop 17 } 18 19 20 //worker.js 21 const net = require('net'); 22 process.on('message', function (m, handle) { 23 start(handle); 24 }); 25 26 var buf = 'hello Node.js'; 27 var res = ['HTTP/1.1 200 OK','content-length:'+buf.length].join('\r\n')+'\r\n\r\n'+buf; 28 29 function start(handle) { 30 console.log('got a connection on worker, pid = %d', process.pid); 31 var socket = new net.Socket({ 32 handle: handle 33 }); 34 socket.readable = socket.writable = true; 35 socket.end(res); 36 }
1 var cluster = require('cluster'); 2 var http = require('http'); 3 var numCPUs = require('os').cpus().length; 4 5 if (cluster.isMaster) { 6 console.log('[master] ' + "start master..."); 7 8 for (var i = 0; i < numCPUs; i++) { 9 cluster.fork(); 10 } 11 12 cluster.on('listening', function (worker, address) { 13 console.log('[master] ' + 'listening: worker' + worker.id + ',pid:' + worker.process.pid + ', Address:' + address.address + ":" + address.port); 14 }); 15 16 } else if (cluster.isWorker) { 17 console.log('[worker] ' + "start worker ..." + cluster.worker.id); 18 var num = 0; 19 http.createServer(function (req, res) { 20 num++; 21 console.log('worker'+cluster.worker.id+":"+num); 22 res.end('worker'+cluster.worker.id+',PID:'+process.pid); 23 }).listen(3000); 24 }
1 var cluster = require('cluster'); 2 var numCPUs = require('os').cpus().length; 3 4 if (cluster.isMaster) { 5 console.log('[master] ' + "start master..."); 6 7 for (var i = 0; i < numCPUs; i++) { 8 cluster.fork(); 9 } 10 11 cluster.on('listening', function (worker, address) { 12 console.log('[master] ' + 'listening: worker' + worker.id + ',pid:' + worker.process.pid + ', Address:' + address.address + ":" + address.port); 13 }); 14 15 } else if (cluster.isWorker) { 16 require('app.js'); 17 } 18 //app.js就是开启具体的业务逻辑了 19 20 //app.js具体内容 21 const net = require('net'); 22 //自动创建socket 23 const server = net.createServer(function(socket) { //'connection' listener 24 socket.on('end', function() { 25 console.log('server disconnected'); 26 }); 27 socket.on('data', function() { 28 socket.end('hello\r\n'); 29 }); 30 }); 31 //开启端口的监听 32 server.listen(8124, function() { //'listening' listener 33 console.log('working') 34 });
siege -c 100 -r 2 http://localhost:8124
Transactions: 200 hits Availability: 100.00 % Elapsed time: 2.09 secs Data transferred: 0.00 MB Response time: 0.02 secs Transaction rate: 95.69 trans/sec Throughput: 0.00 MB/sec Concurrency: 1.74 Successful transactions: 200 Failed transactions: 0 Longest transaction: 0.05 Shortest transaction: 0.02
Transactions: 200 hits Availability: 100.00 % Elapsed time: 13.46 secs Data transferred: 0.15 MB Response time: 3.64 secs Transaction rate: 14.86 trans/sec Throughput: 0.01 MB/sec Concurrency: 54.15 Successful transactions: 200 Failed transactions: 0 Longest transaction: 11.27 Shortest transaction: 0.01
Concurrency is average number of simultaneous connections, a number which rises as server performance decreases.
brew install siege
www.example.com www.example.org 123.45.67.89
siege -f your/file/path.txt -c 100 -t 10s
转载于:https://www.cnblogs.com/joyco773/p/11552473.html
node.js使用cluster实现多进程相关推荐
- 八七、Node.js事件循环与多进程
nodejs事件循环与多进程 why 事件循环对于深入理解nodejs异步至关重要 fs, net,http,events 事件循环是企业面试中的最高频考题之一 能驾驭nodejs多进程是一名资深前端 ...
- Node.js 多进程/线程 —— 日志系统架构优化实践
1. 背景 在日常的项目中,常常需要在用户侧记录一些关键的行为,以日志的形式存储在用户本地,对日志进行定期上报.这样能够在用户反馈问题时,准确及时的对问题进行定位. 为了保证日志信息传输的安全.缩小日 ...
- [转] Node.js的线程和进程
[From] http://www.admin10000.com/document/4196.html 前言 很多Node.js初学者都会有这样的疑惑,Node.js到底是单线程的还是多线程的?通过本 ...
- Node.js的线程和进程*2014年4月的文章
在学习本章之前,读者需要对Node.js有一个初步的认识,熟悉Node.js基本语法.cluster模块.child_process模块和express框架:接触过apache的http压力测试工具a ...
- 【nodejs原理源码赏析(4)】深度剖析cluster模块源码与node.js多进程(上)
[摘要] 集群管理模块cluster浅析 示例代码托管在:http://www.github.com/dashnowords/blogs 一. 概述 cluster模块是node.js中用于实现和管理 ...
- 【nodejs原理源码赏析(6)】深度剖析cluster模块源码与node.js多进程(下)
目录 一. 引言 二.server.listen方法 三.cluster._getServer( )方法 四.跨进程通讯工具方法Utils 五.act:queryServer消息 六.轮询调度Roun ...
- 【nodejs原理源码赏析(6)】深度剖析cluster模块源码与node.js多进程
示例代码托管在:http://www.github.com/dashnowords/blogs 博客园地址:<大史住在大前端>原创博文目录 华为云社区地址:[你要的前端打怪升级指南] 文章 ...
- node开启子线程_多进程 amp; Node.js web 实现
更好阅读体验: 多进程 & Node.js 实现 · 语雀www.yuque.com 进程与线程 进程和线程的诞生要从多任务谈起,多任务是指操作系统可以在同一时间内运行多个应用程序,CPU ...
- mysql cluster proxy_GitHub - freedaxin/maya: a mysql cluster proxy powered by node.js
maya 安装node.js 依赖node v0.8最新版,暂不支持更高的node版本,此处以0.8.7版本为例. root安装(官方要求python2.5.2以上) tar -zxf node-v0 ...
- 【nodejs原理源码赏析(4)】深度剖析cluster模块源码与node.js多线程(上)
[摘要] 集群管理模块cluster浅析 示例代码托管在:http://www.github.com/dashnowords/blogs 一. 概述 cluster模块是node.js中用于实现和管理 ...
最新文章
- Asp.Net 创建MetaWeblog API
- maven项目编译漏掉src/main/java下的xml配置文件
- 室内使用酒精消毒的时候一定要注意开窗!!!
- 第二阶段_第三小节_C#基础
- boost::contract模块实现union的测试程序
- 转:在 C# 中使用 P/Invoke 调用 Mupdf 函数库显示 PDF 文档
- “Word.Tables”并不包含“Item”的定义的解决办法
- jdbc连接mysql8的一些坑_mysql8.0 jdbc连接注意事项
- 快速排序里的学问:从猜数字开始 猜数字里的算法思想
- 当下,所有工程师都要具备技术变现思考和能力【赢在CSDN】
- python要求将字符串循环右移n次_python 基础知识
- 在OneNote中快速插入当前日期和时间
- Node.js相关——CommonJS规范
- 分享一些C语言的学习资料
- Proteus软件初学笔记
- 斩不断、理还乱,论家事,别有一番滋味在心头。
- echarts柱状图实现正负值不同颜色在上方显示数值
- mapreduce运行的bug收录
- 2017cad光标大小怎么调_cad十字光标怎么调大-调整cad十字光标大小的方法 - 河东软件园...
- Kanzi学习之路(7):kanzi的资源预加载
热门文章
- 计算机视觉(CV)前沿国际国内期刊与会议
- C/C++变量在内存中的分布
- python random函数_python随机模块random的22种函数(小结)
- onclick 获取img 里面的id_续航可达550公里,ID.4 CROZZ打碎“纯电动汽车续航短”偏见...
- 拓端tecdat|python算法对音频信号处理Sonification :Gauss-Seidel迭代算法
- 拓端tecdat|R语言highfrequency高频金融数据导入
- 计算机控制开关,开关电源的计算机控制系统
- visual studio配置opencv
- AES-128\192\256加密算法及其安全脆弱分析
- Topic Model的分类总结(LDA变种)