node --- [node接口阅读]cluster的使用
目标
- 在主进程中完成以下事情:
- 每隔1秒钟输出,当前请求的数量
- 创建等同于CPU数量的进程
- 对每个进程施加一个处理函数,用于统计请求的数量
- 在各个CPU的进程中完成以下事情
- 监听8000端口的请求,并返回最简单的信息
- 发送事件,以触发主进程中施加的事件处理函数
前置知识
- process.pid
在主进程cluster.isMaster
中,process.id
是主进程的id
在工作进程(子进程)cluster.isWorker
中,process.id
是工作进程(子进程)的id
- 获取cpu的数量
const numCPUs = require('os').cpus().length;
- 判断一个进程是否为主进程
const cluster = require('cluster');
if(cluster.isMaster) { ... }
- 创建一个新进程
const cluster = require('cluster');
const work = cluster.fork();
实现
const cluster= require('cluster');
const http = require('http');if(cluster.isMaster) {// 主进程let count = 0;// 每隔1秒钟,就输出当前的访问次数setInterval(()=>{console.log(`访问次数为: ${count}`)}, 1000);let numCPUs = require('os').cpus().length;for(let i =0 ; i < numCPUs ; i++) {cluster.fork(); // 创建等同于cpu核数的进程}for(let id in cluster.workers){cluster.workers[id].on('message', (msg) =>{if(msg.cmd && msg.cmd === 'notifyRequest') {count++;}})}
} else {// 子进程http.Server((req, res) => {if(req.url !== '/favicon.ico') {res.writeHead(200);res.end('Hi Marron');// 通知执行 cmd.notifyRequest 事件process.send({cmd: 'notifyRequest'});}}).listen(8000)
}
扩展
- 由于node.js是单线程.很容易卡死而导致崩溃.如下
const Koa = require('koa');
const app = new Koa();
app.use(async (ctx, next) =>{aaa();await next();ctx.body = 'marron';
});
app.listen(3000);
- 说明会直接报错
ReferenceError: aaa is not defined
,会直接退出当前进程. - 思路: 可以在主进程中监听,一旦发现有进程死亡,就开启新的进程.
综上所述,明确在主进程中的目标:
- 开启等同于CPU核数的进程,并将进程保存在进程组(workers)对象中.
- 监听进程的死亡,一旦发现.就创建新的进程,并将新的进程替换挂掉的那个进程
子进程:
- 创建一个http服务器监听3000端口
- 当访问该端口时,以一定的几率报错(让当天进程死亡).
const cluster = require('cluster');
const os = require('os');
const numCPUs = os.cpus().length;
const process = require('process');// 保存进程组的对象
const workers = {};
if(cluster.isMaster) {// 主进程for(let i = 0; i< numCPUs; i++){const worker = cluster.fork(); // 创建一个进程workers[worker['pid']] = worker; // 保存当前进程}cluster.on('death', function(worker){// 监听进程的死亡nWorker = cluster.fork(); // 新建进程workers[worker.pid] = nWorker;})
} else {const Koa = require('koa');const app = new Koa();app.use(async (ctx, next) => {Math.random > 0.95 ? aaa() : ''; // 手动挂掉进程console.log(`current process ${process.pid}`);await next();ctx.body = 'marron';})app.listen(3000);
}
当挂的时候,自动重新启动当前服务
node --- [node接口阅读]cluster的使用相关推荐
- 【Node.js】关于Node.js接口的详解和案例--restful风格接口。案例:添加商品接口,添加员工接口,删除员工接口
1.首先我们需要知道,接口是什么? 接口是后端为前端提供的数据--动态资源:Node.js通过每一个路由就可以实现接口 2.RESTful接口:是一种接口的架构风格 1.请求的URL(资源) 在资源前 ...
- 装饰器+依赖注入开发node后台接口
前言 起因来源于最近在开发一个小网站的时候,突发奇想,想要使用node来自己开发后台接口,毕竟每一个前端都有一个全栈的梦想
- node服务器接口不稳定,node服务部署到服务器后,数据接口404
最近的一个项目,数据接口一部分是调JAVA后台的,一部分是本地node服务,弄得服务的数据源是从一个个json文件里面取的. 项目接近尾声,需要将项目打包后放到服务器上去,这个时候就醉了,java后台 ...
- Node.js 代码阅读笔记系列(0)Timer 的实现
setImmediate 先来看看当我们使用 setImmediate 的时候经历了那些过程 我们先这样用 setImmediate(fn, arg)复制代码 可以看到 setImmediate 接收 ...
- 前端程序员福利 利用node写接口
Code is never die ! 前端程序员为什么要自己写接口?
- node实现接口资源批量管理(含excel数据导入及模板下载)
概述 该功能是基于BSPV1.0版本中资源管理的扩展,在资源管理中添加接口资源,方便在对角色授权时做到更加精确的控制.第一层级为系统,第二层级为系统模块,第三层级为接口 UI图 [外链图片转存失败,源 ...
- Node——Node基础
一.模块化开发 之前的练习,使用node运行一个js文件.但是实际项目开发中,不可能将全部代码都写在一个文件中.node为我们提供了模块化的语法,每一个js文件都可以当作一个模块 require()引 ...
- [Node]node.js实现登录注册
目录 背景 笔记 node基础 node介绍 node模块 数据交互 get post 案例 背景 补充学习下node知识,课程来自imooc.个人学习笔记,如有侵权,会删除.提示直接从http模块看 ...
- [node] node
# module.filename:开发期间,该行代码所在的文件. __filename:始终等于 module.filename. __dirname:开发期间,该行代码所在的目录. process ...
最新文章
- 【转】Visual Studio团队资源管理器 Git 源码管理工具简单入门
- logstash tcp multihost output(多目标主机输出,保证TCP输出链路的稳定性)
- 【bzoj4318】OSU! 期望dp
- UVa 1025 A Spy in the Metro
- 当前工程读取配置文件示例
- lxrun不是内部或外部命令_在Win10 安装 WSL的Linux子系统,解决cmd中执行lxrun时提示“不是内部或外部命令”...
- AI又输了!中国传奇Dota2冠军联手,OpenAI快速进化然并卵
- ASP.NET配置设置-关于web.config各节点的讲解
- 程序员必读的30本书籍
- 2022新版起点云码支付 带云端支持云端授权域名代理
- cdr图片随意拉伸变形_PS入门篇(6)—修改图片尺寸
- pycharm中的Run with Python console功能是什么意思?
- java 浮雕效果,制作逼真缝线牛皮文字效果的PS教程
- 电脑无线(外网)和有线(内网)网络同时使用方法
- 点击切换图标(收藏和取消收藏)
- 【图像分割】ExG超绿特征灰度化、二值化分割(Matlab及Python代码实现)
- 03-docker系列-docker容器的基本操作
- chunk和block 区别
- DG4V-5系列电磁阀配套线圈6033556-001
- 用css3-做一个旋转的小风车
热门文章
- oracle rac em cluster name,ORACLE 11G RAC重建EM问题
- sap 分割评估_SAP那些事-实战篇-73-受托加工的几种方案探讨
- php ziparchive(),php的ZipArchive类用法实例
- 【caffe-Windows】微软官方caffe之 Python接口配置及图片生成实例
- JavaWeb:脚本标识
- 同步异步单线程多线程初级理解
- centos 6.5 配置网络
- JAVA Spring 事物 ( 已转账为例 ) 基于 AOP 注解
- mysql一些写常用命令
- 文本框点击后文字消失总结