欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Nodejs-cluster模塊知識點總結(jié)及實例用法

 更新時間:2021年12月14日 08:33:14   作者:青燈夜游  
在本篇文章里小編給大家整理的是一篇關(guān)于Nodejs-cluster模塊知識點總結(jié)及實例用法,有興趣的朋友們可以跟著學(xué)習(xí)下。

面試官有時候會問你,你給我說下nodejs如何開啟多進程哇,你腦海里就應(yīng)該立刻出現(xiàn)cluster模塊,如今讓我?guī)闳ヌ接懴耤luster模塊的使用。

基本用法

Node.js默認單進程運行,對于32位系統(tǒng)最高可以使用512MB內(nèi)存,對于64位最高可以使用1GB內(nèi)存。對于多核CPU的計算機來說,這樣做效率很低,因為只有一個核在運行,其他核都在閑置。cluster模塊就是為了解決這個問題而提出的。

cluster模塊允許設(shè)立一個主進程和若干個worker進程,由主進程監(jiān)控和協(xié)調(diào)worker進程的運行。worker之間采用進程間通信交換消息,cluster模塊內(nèi)置一個負載均衡器,采用Round-robin算法協(xié)調(diào)各個worker進程之間的負載。運行時,所有新建立的鏈接都由主進程完成,然后主進程再把TCP連接分配給指定的worker進程。

var cluster = require('cluster');
var os = require('os');

if (cluster.isMaster){
for (var i = 0, n = os.cpus().length; i < n; i += 1){
cluster.fork();
}
} else {
http.createServer(function(req, res) {
res.writeHead(200);
res.end("hello world\n");
}).listen(8000);
}

上面代碼先判斷當前進程是否為主進程(cluster.isMaster),如果是的,就按照CPU的核數(shù),新建若干個worker進程;如果不是,說明當前進程是worker進程,則在該進程啟動一個服務(wù)器程序。

上面這段代碼有一個缺點,就是一旦work進程掛了,主進程無法知道。為了解決這個問題,可以在主進程部署online事件和exit事件的監(jiān)聽函數(shù)。

var cluster = require('cluster');
 
if(cluster.isMaster) {
  var numWorkers = require('os').cpus().length;
  console.log('Master cluster setting up ' + numWorkers + ' workers...');
 
  for(var i = 0; i < numWorkers; i++) {
    cluster.fork();
  }
 
  cluster.on('online', function(worker) {
    console.log('Worker ' + worker.process.pid + ' is online');
  });
 
  cluster.on('exit', function(worker, code, signal) {
    console.log('Worker ' + worker.process.pid + ' died with code: ' + code + ', and signal: ' + signal);
    console.log('Starting a new worker');
    cluster.fork();
  });
}

上面代碼中,主進程一旦監(jiān)聽到worker進程的exit事件,就會重啟一個worker進程。worker進程一旦啟動成功,可以正常運行了,就會發(fā)出online事件。

worker對象

worker對象是cluster.fork()的返回值,代表一個worker進程。

它的屬性和方法如下。

(1)worker.id

worker.id返回當前worker的獨一無二的進程編號。這個編號也是cluster.workers中指向當前進程的索引值。

(2)worker.process

所有的worker進程都是用child_process.fork()生成的。child_process.fork()返回的對象,就被保存在worker.process之中。通過這個屬性,可以獲取worker所在的進程對象。

(3)worker.send()

該方法用于在主進程中,向子進程發(fā)送信息。

if (cluster.isMaster) {
  var worker = cluster.fork();
  worker.send('hi there');
} else if (cluster.isWorker) {
  process.on('message', function(msg) {
    process.send(msg);
  });
}

上面代碼的作用是,worker進程對主進程發(fā)出的每個消息,都做回聲。

在worker進程中,要向主進程發(fā)送消息,使用process.send(message);要監(jiān)聽主進程發(fā)出的消息,使用下面的代碼。

process.on('message', function(message) {
  console.log(message);
});

發(fā)出的消息可以字符串,也可以是JSON對象。下面是一個發(fā)送JSON對象的例子。

worker.send({
  type: 'task 1',
  from: 'master',
  data: {
    // the data that you want to transfer
  }
});

cluster.workers對象

該對象只有主進程才有,包含了所有worker進程。每個成員的鍵值就是一個worker進程對象,鍵名就是該worker進程的worker.id屬性。

socket.on('data', function(id) {
  var worker = cluster.workers[id];
});

cluster模塊的屬性與方法

isMaster,isWorker

isMaster屬性返回一個布爾值,表示當前進程是否為主進程。這個屬性由process.env.NODE_UNIQUE_ID決定,如果process.env.NODE_UNIQUE_ID為未定義,就表示該進程是主進程。

isWorker屬性返回一個布爾值,表示當前進程是否為work進程。它與isMaster屬性的值正好相反。

fork()

fork方法用于新建一個worker進程,上下文都復(fù)制主進程。只有主進程才能調(diào)用這個方法。

該方法返回一個worker對象。

kill()

kill方法用于終止worker進程。它可以接受一個參數(shù),表示系統(tǒng)信號。

如果當前是主進程,就會終止與worker.process的聯(lián)絡(luò),然后將系統(tǒng)信號法發(fā)向worker進程。如果當前是worker進程,就會終止與主進程的通信,然后退出,返回0。

在以前的版本中,該方法也叫做 worker.destroy() 。

listening事件

worker進程調(diào)用listening方法以后,“l(fā)istening”事件就傳向該進程的服務(wù)器,然后傳向主進程。

該事件的回調(diào)函數(shù)接受兩個參數(shù),一個是當前worker對象,另一個是地址對象,包含網(wǎng)址、端口、地址類型(IPv4、IPv6、Unix socket、UDP)等信息。這對于那些服務(wù)多個網(wǎng)址的Node應(yīng)用程序非常有用。

不中斷地重啟Node服務(wù)

重啟服務(wù)需要關(guān)閉后再啟動,利用cluster模塊,可以做到先啟動一個worker進程,再把原有的所有work進程關(guān)閉。這樣就能實現(xiàn)不中斷地重啟Node服務(wù)。

首先,主進程向worker進程發(fā)出重啟信號。

workers[wid].send({type: 'shutdown', from: 'master'});

worker進程監(jiān)聽message事件,一旦發(fā)現(xiàn)內(nèi)容是shutdown,就退出。

process.on('message', function(message) {
  if(message.type === 'shutdown') {
    process.exit(0);
  }
});

下面是一個關(guān)閉所有worker進程的函數(shù)。

function restartWorkers() {
  var wid, workerIds = [];
  for(wid in cluster.workers) {
    workerIds.push(wid);
  }
 
  workerIds.forEach(function(wid) {
    cluster.workers[wid].send({
      text: 'shutdown',
      from: 'master'
     });
    setTimeout(function() {
      if(cluster.workers[wid]) {
        cluster.workers[wid].kill('SIGKILL');
      }
    }, 5000);
  });
};

PM2模塊

PM2模塊是cluster模塊的一個包裝層。它的作用是盡量將cluster模塊抽象掉,讓用戶像使用單進程一樣,部署多進程Node應(yīng)用。

// app.js
var http = require('http');
 
http.createServer(function(req, res) {
  res.writeHead(200);
  res.end("hello world");
}).listen(8080);

用PM2從命令行啟動這段代碼

$ pm2 start app.js -i 4

上面代碼的i參數(shù)告訴PM2,這段代碼應(yīng)該在cluster_mode啟動,且新建worker進程的數(shù)量是4個。如果i參數(shù)的值是0,那么當前機器有幾個CPU內(nèi)核,PM2就會啟動幾個worker進程。

如果一個worker進程由于某種原因掛掉了,會立刻重啟該worker進程。

# 重啟所有worker進程
$ pm2 reload all

每個worker進程都有一個id,可以用下面的命令查看單個worker進程的詳情。

$ pm2 show <worker id>

關(guān)閉worker進程的時候,可以部署下面的代碼,讓worker進程監(jiān)聽shutdown消息。一旦收到這個消息,進行完畢收尾清理工作再關(guān)閉

process.on('message', function(msg) {
  if (msg === 'shutdown') {
    close_all_connections();
    delete_logs();
    server.close();
    process.exit(0);
  }
});

到此這篇關(guān)于Nodejs-cluster模塊知識點總結(jié)及實例用法的文章就介紹到這了,更多相關(guān)Nodejs-cluster模塊介紹內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Node.js中path模塊的resolve()和join()方法的區(qū)別

    詳解Node.js中path模塊的resolve()和join()方法的區(qū)別

    這篇文章主要介紹了詳解Node.js中path模塊的resolve()和join()方法的區(qū)別,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-10-10
  • 使用nodeJs來安裝less及編譯less文件為css文件的方法

    使用nodeJs來安裝less及編譯less文件為css文件的方法

    這篇文章主要介紹了使用nodeJs來安裝less及編譯less文件為css文件的方法,在文章末尾給大家補充介紹了通過nodejs將less文件轉(zhuǎn)為css文件的方法,具體內(nèi)容詳情大家通過本文學(xué)習(xí)吧
    2017-11-11
  • node.js中的fs.createWriteStream方法使用說明

    node.js中的fs.createWriteStream方法使用說明

    這篇文章主要介紹了node.js中的fs.createWriteStream方法使用說明,本文介紹了fs.createWriteStream方法說明、語法、接收參數(shù)、使用實例和實現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • Node.js API詳解之 V8模塊用法實例分析

    Node.js API詳解之 V8模塊用法實例分析

    這篇文章主要介紹了Node.js API詳解之 V8模塊用法,結(jié)合實例形式分析了Node.js API中V8模塊基本功能、函數(shù)、使用用法及操作注意事項,需要的朋友可以參考下
    2020-06-06
  • ExpressJS入門實例

    ExpressJS入門實例

    這篇文章主要介紹了ExpressJS入門實例,本文講解了創(chuàng)建項目、進入目錄、安裝項目依賴的包、創(chuàng)建應(yīng)用程序、運行程序等內(nèi)容,需要的朋友可以參考下
    2015-01-01
  • 為何從eggjs升級到midwayjs的原因詳解

    為何從eggjs升級到midwayjs的原因詳解

    這篇文章主要為大家介紹了為何從eggjs升級到midwayjs的原因詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • node.js實現(xiàn)上傳文件功能

    node.js實現(xiàn)上傳文件功能

    這篇文章主要為大家詳細介紹了node.js實現(xiàn)上傳文件功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • Nodejs實現(xiàn)的一個簡單udp廣播服務(wù)器、客戶端

    Nodejs實現(xiàn)的一個簡單udp廣播服務(wù)器、客戶端

    這篇文章主要介紹了Nodejs實現(xiàn)的一個簡單udp廣播服務(wù)器、客戶端,本文直接給出實現(xiàn)代碼,需要的朋友可以參考下
    2014-09-09
  • Node.js中DNS模塊學(xué)習(xí)總結(jié)

    Node.js中DNS模塊學(xué)習(xí)總結(jié)

    本篇文章給大家詳細介紹了Node.js中DNS模塊的相關(guān)知識點,以及相關(guān)的實例代碼做了分享,有興趣的朋友參考下。
    2018-02-02
  • nodejs實現(xiàn)超簡單生成二維碼的方法

    nodejs實現(xiàn)超簡單生成二維碼的方法

    這篇文章主要介紹了nodejs實現(xiàn)超簡單生成二維碼的方法,結(jié)合實例形式分析了nodejs基于qr-image插件生成二維碼的相關(guān)操作技巧,需要的朋友可以參考下
    2018-03-03

最新評論