久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      聊聊Nodejs-cluster模塊,介紹一下其使用方法

      本篇文章帶大家了解一下node中的Nodejs-cluster模塊,介紹一下Nodejs-cluster模塊的用法,希望對大家有所幫助!

      聊聊Nodejs-cluster模塊,介紹一下其使用方法

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

      基本用法

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

      cluster模塊允許設立一個主進程和若干個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 worldn");   }).listen(8000); }

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

      上面這段代碼有一個缺點,就是一旦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屬性。

      function eachWorker(callback) {   for (var id in cluster.workers) {     callback(cluster.workers[id]);   } } eachWorker(function(worker) {   worker.send('big announcement to all workers'); });

      上面代碼用來遍歷所有worker進程。

      當前socket的data事件,也可以用id屬性識別worker進程。

      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進程,上下文都復制主進程。只有主進程才能調(diào)用這個方法。

      該方法返回一個worker對象。

      kill()

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

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

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

      listening事件

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

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

      不中斷地重啟Node服務

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

      首先,主進程向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);   } });

      下面是一個關閉所有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應用。

      // 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,這段代碼應該在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>

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

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

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號