目标

  • 在主进程中完成以下事情:
  1. 每隔1秒钟输出,当前请求的数量
  2. 创建等同于CPU数量的进程
  3. 对每个进程施加一个处理函数,用于统计请求的数量
  • 在各个CPU的进程中完成以下事情
  1. 监听8000端口的请求,并返回最简单的信息
  2. 发送事件,以触发主进程中施加的事件处理函数

前置知识

  • 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,会直接退出当前进程.
  • 思路: 可以在主进程中监听,一旦发现有进程死亡,就开启新的进程.

综上所述,明确在主进程中的目标:

  1. 开启等同于CPU核数的进程,并将进程保存在进程组(workers)对象中.
  2. 监听进程的死亡,一旦发现.就创建新的进程,并将新的进程替换挂掉的那个进程

子进程:

  1. 创建一个http服务器监听3000端口
  2. 当访问该端口时,以一定的几率报错(让当天进程死亡).
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的使用相关推荐

  1. 【Node.js】关于Node.js接口的详解和案例--restful风格接口。案例:添加商品接口,添加员工接口,删除员工接口

    1.首先我们需要知道,接口是什么? 接口是后端为前端提供的数据--动态资源:Node.js通过每一个路由就可以实现接口 2.RESTful接口:是一种接口的架构风格 1.请求的URL(资源) 在资源前 ...

  2. 装饰器+依赖注入开发node后台接口

    前言  起因来源于最近在开发一个小网站的时候,突发奇想,想要使用node来自己开发后台接口,毕竟每一个前端都有一个全栈的梦想

  3. node服务器接口不稳定,node服务部署到服务器后,数据接口404

    最近的一个项目,数据接口一部分是调JAVA后台的,一部分是本地node服务,弄得服务的数据源是从一个个json文件里面取的. 项目接近尾声,需要将项目打包后放到服务器上去,这个时候就醉了,java后台 ...

  4. Node.js 代码阅读笔记系列(0)Timer 的实现

    setImmediate 先来看看当我们使用 setImmediate 的时候经历了那些过程 我们先这样用 setImmediate(fn, arg)复制代码 可以看到 setImmediate 接收 ...

  5. 前端程序员福利 利用node写接口

    Code is never die ! 前端程序员为什么要自己写接口?

  6. node实现接口资源批量管理(含excel数据导入及模板下载)

    概述 该功能是基于BSPV1.0版本中资源管理的扩展,在资源管理中添加接口资源,方便在对角色授权时做到更加精确的控制.第一层级为系统,第二层级为系统模块,第三层级为接口 UI图 [外链图片转存失败,源 ...

  7. Node——Node基础

    一.模块化开发 之前的练习,使用node运行一个js文件.但是实际项目开发中,不可能将全部代码都写在一个文件中.node为我们提供了模块化的语法,每一个js文件都可以当作一个模块 require()引 ...

  8. [Node]node.js实现登录注册

    目录 背景 笔记 node基础 node介绍 node模块 数据交互 get post 案例 背景 补充学习下node知识,课程来自imooc.个人学习笔记,如有侵权,会删除.提示直接从http模块看 ...

  9. [node] node

    # module.filename:开发期间,该行代码所在的文件. __filename:始终等于 module.filename. __dirname:开发期间,该行代码所在的目录. process ...

最新文章

  1. 【转】Visual Studio团队资源管理器 Git 源码管理工具简单入门
  2. logstash tcp multihost output(多目标主机输出,保证TCP输出链路的稳定性)
  3. 【bzoj4318】OSU! 期望dp
  4. UVa 1025 A Spy in the Metro
  5. 当前工程读取配置文件示例
  6. lxrun不是内部或外部命令_在Win10 安装 WSL的Linux子系统,解决cmd中执行lxrun时提示“不是内部或外部命令”...
  7. AI又输了!中国传奇Dota2冠军联手,OpenAI快速进化然并卵
  8. ASP.NET配置设置-关于web.config各节点的讲解
  9. 程序员必读的30本书籍
  10. 2022新版起点云码支付 带云端支持云端授权域名代理
  11. cdr图片随意拉伸变形_PS入门篇(6)—修改图片尺寸
  12. pycharm中的Run with Python console功能是什么意思?
  13. java 浮雕效果,制作逼真缝线牛皮文字效果的PS教程
  14. 电脑无线(外网)和有线(内网)网络同时使用方法
  15. 点击切换图标(收藏和取消收藏)
  16. 【图像分割】ExG超绿特征灰度化、二值化分割(Matlab及Python代码实现)
  17. 03-docker系列-docker容器的基本操作
  18. chunk和block 区别
  19. DG4V-5系列电磁阀配套线圈6033556-001
  20. 用css3-做一个旋转的小风车

热门文章

  1. oracle rac em cluster name,ORACLE 11G RAC重建EM问题
  2. sap 分割评估_SAP那些事-实战篇-73-受托加工的几种方案探讨
  3. php ziparchive(),php的ZipArchive类用法实例
  4. 【caffe-Windows】微软官方caffe之 Python接口配置及图片生成实例
  5. JavaWeb:脚本标识
  6. 同步异步单线程多线程初级理解
  7. centos 6.5 配置网络
  8. JAVA Spring 事物 ( 已转账为例 ) 基于 AOP 注解
  9. mysql一些写常用命令
  10. 文本框点击后文字消失总结