日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

node --- [node接口阅读]cluster的使用

發(fā)布時間:2023/12/10 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 node --- [node接口阅读]cluster的使用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目標

  • 在主進程中完成以下事情:
  • 每隔1秒鐘輸出,當前請求的數(shù)量
  • 創(chuàng)建等同于CPU數(shù)量的進程
  • 對每個進程施加一個處理函數(shù),用于統(tǒng)計請求的數(shù)量
    • 在各個CPU的進程中完成以下事情
  • 監(jiān)聽8000端口的請求,并返回最簡單的信息
  • 發(fā)送事件,以觸發(fā)主進程中施加的事件處理函數(shù)

  • 前置知識

    • process.pid
      在主進程cluster.isMaster中, process.id是主進程的id
      在工作進程(子進程)cluster.isWorker中,process.id是工作進程(子進程)的id

    • 獲取cpu的數(shù)量
    const numCPUs = require('os').cpus().length;
    • 判斷一個進程是否為主進程
    const cluster = require('cluster'); if(cluster.isMaster) { ... }
    • 創(chuàng)建一個新進程
    const cluster = require('cluster'); const work = cluster.fork();

    實現(xiàn)

    const cluster= require('cluster'); const http = require('http');if(cluster.isMaster) {// 主進程let count = 0;// 每隔1秒鐘,就輸出當前的訪問次數(shù)setInterval(()=>{console.log(`訪問次數(shù)為: ${count}`)}, 1000);let numCPUs = require('os').cpus().length;for(let i =0 ; i < numCPUs ; i++) {cluster.fork(); // 創(chuàng)建等同于cpu核數(shù)的進程}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');// 通知執(zhí)行 cmd.notifyRequest 事件process.send({cmd: 'notifyRequest'});}}).listen(8000) }


    擴展

    • 由于node.js是單線程.很容易卡死而導(dǎo)致崩潰.如下
    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,會直接退出當前進程.
    • 思路: 可以在主進程中監(jiān)聽,一旦發(fā)現(xiàn)有進程死亡,就開啟新的進程.

    綜上所述,明確在主進程中的目標:

  • 開啟等同于CPU核數(shù)的進程,并將進程保存在進程組(workers)對象中.
  • 監(jiān)聽進程的死亡,一旦發(fā)現(xiàn).就創(chuàng)建新的進程,并將新的進程替換掛掉的那個進程
  • 子進程:

  • 創(chuàng)建一個http服務(wù)器監(jiān)聽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(); // 創(chuàng)建一個進程workers[worker['pid']] = worker; // 保存當前進程}cluster.on('death', function(worker){// 監(jiān)聽進程的死亡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); }


    當掛的時候,自動重新啟動當前服務(wù)

    總結(jié)

    以上是生活随笔為你收集整理的node --- [node接口阅读]cluster的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。