亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Node.js進(jìn)程管理之進(jìn)程集群詳解

 更新時(shí)間:2022年07月06日 14:14:44   作者:社會(huì)主義接班人  
這篇文章介紹了Node.js進(jìn)程管理之進(jìn)程集群,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

一、cluster模塊

Node.js是單線程處理,對(duì)于高并發(fā)的請(qǐng)求怎么樣能增加吞吐量呢?為了提高服務(wù)器的利用率,能不能多核的來(lái)處理呢?于是就有了cluster模塊。

cluster模塊可以輕松實(shí)現(xiàn)運(yùn)行在同一機(jī)器不同進(jìn)程上的TCP或HTTP服務(wù)器集群。它們?nèi)允褂孟嗤牡讓犹捉幼?,從而在相同的IP地址和端口組合上處理請(qǐng)求。

下面是它的一些事件屬性和方法。

事件:

fork:當(dāng)新的工作進(jìn)程已經(jīng)被派生時(shí)發(fā)出。callback函數(shù)接收worker對(duì)象作為唯一的參數(shù)。function(Worker)

online:當(dāng)新的進(jìn)程發(fā)回一消息,表明它已經(jīng)啟動(dòng)時(shí)發(fā)出。callback同上。

listening:當(dāng)工作進(jìn)程調(diào)用listen()開(kāi)始監(jiān)聽(tīng)端口時(shí)發(fā)出。callback:fucntion(Worker,address)

disconnect:當(dāng)IPC通道被切斷時(shí)發(fā)出。如服務(wù)器調(diào)用worker.disconnect()的時(shí)候。callback:function(Worker)

exit:在Worker對(duì)象已斷開(kāi)時(shí)發(fā)出。callback:function(Worker,code,signal)

setup:在setupMaster()被首次調(diào)用時(shí)發(fā)出。

屬性和方法:

settings:包含exec(工作進(jìn)程的javascript文件)、args(傳遞的參數(shù)數(shù)組)、silent(斷開(kāi)工作進(jìn)程的IPC機(jī)制)屬性值,用于建立集群

isMaster:判斷當(dāng)前進(jìn)程是否是主進(jìn)程

isWorker:判斷當(dāng)前進(jìn)程是否是工作進(jìn)程

setupMaster([settings]):啟動(dòng)主進(jìn)程

disconnect([callback]):斷開(kāi)工作進(jìn)程的IPC機(jī)制,并關(guān)閉句柄,當(dāng)斷開(kāi)連接完成時(shí)回調(diào)

worker:引用在工作進(jìn)程的當(dāng)前Worker對(duì)象

workers:包含Worker對(duì)象,可以通過(guò)標(biāo)識(shí)從主進(jìn)程引用它們。cluster.workers[workerId]

二、Worker對(duì)象

當(dāng)一個(gè)工作進(jìn)程被派時(shí),一個(gè)新的Worker對(duì)象同時(shí)在主進(jìn)程和工作進(jìn)程中創(chuàng)建。在工作進(jìn)程中Worker對(duì)象用來(lái)表示當(dāng)前的工作進(jìn)程,并與正在發(fā)生的集群事件進(jìn)行交互。在主進(jìn)程中,Worker對(duì)象代表子工作進(jìn)程,是主應(yīng)用程序向他們發(fā)送信息,接收它們的狀態(tài)變化的事件甚至殺掉他們。

它也是有一些事件屬性方法。

事件:

message:在工作進(jìn)程收到一個(gè)新信息時(shí)發(fā)出,回調(diào)函數(shù)把message作為唯一的參數(shù)值

disconnect:在IPC通道已對(duì)這個(gè)工作進(jìn)程斷開(kāi)后發(fā)出

exit:Worker對(duì)象已經(jīng)斷開(kāi)時(shí)發(fā)出

error:工作進(jìn)程發(fā)生錯(cuò)誤時(shí)發(fā)出

屬性方法:

id:工作進(jìn)程標(biāo)識(shí)

Process:工作進(jìn)程運(yùn)行的ChildProcess對(duì)象

suicide:對(duì)這個(gè)工作進(jìn)程調(diào)用kill()或disconnect()時(shí)被設(shè)置為true??梢允褂么藰?biāo)志來(lái)確定是否要跳出嘗試的循環(huán),并退出

send(message,[sendHandle]):將消息發(fā)送到主進(jìn)程

kill([signal]):通過(guò)斷開(kāi)IPC通道殺掉當(dāng)前工作進(jìn)程,然后退出,將suicide設(shè)置為true。

disconnect():工作進(jìn)程調(diào)它時(shí),關(guān)閉所有服務(wù)器,等待關(guān)閉事件,并斷開(kāi)IPC通道。當(dāng)從主節(jié)點(diǎn)調(diào)時(shí),發(fā)送一個(gè)內(nèi)部消息給工作進(jìn)程,使其斷開(kāi)本身,設(shè)置suicide為true。

三、實(shí)踐

上面的也都是理論,下面通過(guò)實(shí)現(xiàn)一個(gè)HTTP集群來(lái)實(shí)踐一下。

1.主進(jìn)程

var cluster = require('cluster');
var http = require('http');
if (cluster.isMaster) {
  cluster.on('fork', function(worker) {
    console.log("Worker " + worker.id + " created");
  });
  cluster.on('listening', function(worker, address) {
    console.log("Worker " + worker.id +" is listening on " + 
                address.address + ":" + address.port);
  });
  cluster.on('exit', function(worker, code, signal) {
    console.log("Worker " + worker.id +" Exited");    
  });
  cluster.setupMaster({exec:'cluster_worker.js'});
  var numCPUs = require('os').cpus().length;
  for (var i = 0; i < numCPUs; i++) {
    if (i>=4) break;
    cluster.fork();
  }
  Object.keys(cluster.workers).forEach(function(id) {
    cluster.workers[id].on('message', function(message){
      console.log(message);
    });
  });
}

2.工作進(jìn)程

var cluster = require('cluster');
var http = require('http');
if (cluster.isWorker) {
  http.Server(function(req, res) {
    res.writeHead(200);
    res.end("Process " + process.pid + " says hello");
    process.send("Process " + process.pid + " handled request");
  }).listen(8080, function(){
    console.log("Child Server Running on Process: " + process.pid);    
  });
}

3.HTTP客戶端測(cè)試

var http = require('http');
var options = { port: '8080'};
function sendRequest(){
  http.request(options, function(response){
    var serverData = '';
    response.on('data', function (chunk) {
      serverData += chunk;
    });
    response.on('end', function () {
      console.log(serverData);
    });
  }).end();
}
for (var i=0; i<5; i++){
  console.log("Sending Request");
  sendRequest();
}

首先是啟動(dòng)主進(jìn)程,創(chuàng)建工作進(jìn)程開(kāi)始監(jiān)聽(tīng)

"C:\Program Files (x86)\JetBrains\WebStorm 11.0.3\bin\runnerw.exe" F:\nodejs\node.exe cluster_server.js
Worker 1 created
Worker 2 created
Worker 3 created
Worker 4 created
Child Server Running on Process: 6152
Worker 1 is listening on null:8080
Child Server Running on Process: 10340
Worker 2 is listening on null:8080
Child Server Running on Process: 11412
Worker 3 is listening on null:8080
Child Server Running on Process: 12120
Worker 4 is listening on null:8080

其次啟動(dòng)HTTP客戶端測(cè)試

"C:\Program Files (x86)\JetBrains\WebStorm 11.0.3\bin\runnerw.exe" F:\nodejs\node.exe cluster_client.js
Sending Request
Sending Request
Sending Request
Sending Request
Sending Request
Process 12120 says hello
Process 11412 says hello
Process 12120 says hello
Process 10340 says hello
Process 6152 says hello

Process finished with exit code 0

到此這篇關(guān)于Node.js進(jìn)程管理之進(jìn)程集群的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Node.js調(diào)用fs.renameSync報(bào)錯(cuò)(Error: EXDEV, cross-device link not permitted)

    Node.js調(diào)用fs.renameSync報(bào)錯(cuò)(Error: EXDEV, cross-device link not

    這篇文章主要介紹了Node.js調(diào)用fs.renameSync報(bào)錯(cuò)(Error: EXDEV, cross-device link not permitted),非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-12-12
  • Nodejs初級(jí)階段之express

    Nodejs初級(jí)階段之express

    這篇文章主要介紹了Nodejs初級(jí)階段之express的相關(guān)資料,需要的朋友可以參考下
    2015-11-11
  • 手把手帶你安裝多個(gè)node版本

    手把手帶你安裝多個(gè)node版本

    在項(xiàng)目開(kāi)發(fā)過(guò)程中,不同項(xiàng)目使用的node版本不同,有時(shí)會(huì)因?yàn)閚ode版本過(guò)高或太低,導(dǎo)致報(bào)錯(cuò),下面這篇文章主要給大家介紹了關(guān)于安裝多個(gè)node版本的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • Node.js服務(wù)器環(huán)境下使用Mock.js攔截AJAX請(qǐng)求的教程

    Node.js服務(wù)器環(huán)境下使用Mock.js攔截AJAX請(qǐng)求的教程

    Mock.js這個(gè)JavaScript庫(kù)最常見(jiàn)的用法便是被用來(lái)攔截AJAX請(qǐng)求,well,這里我們就來(lái)看一下Node.js服務(wù)器環(huán)境下使用Mock.js攔截AJAX請(qǐng)求的教程:
    2016-05-05
  • nodejs 使用nodejs-websocket模塊實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)實(shí)時(shí)通訊

    nodejs 使用nodejs-websocket模塊實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)實(shí)時(shí)通訊

    這篇文章主要介紹了nodejs 使用nodejs-websocket模塊實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)實(shí)時(shí)通訊的實(shí)例代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-11-11
  • Windows系統(tǒng)下Node.js安裝以及環(huán)境配置的完美教程

    Windows系統(tǒng)下Node.js安裝以及環(huán)境配置的完美教程

    相信對(duì)于很多關(guān)注javascript發(fā)展的同學(xué)來(lái)說(shuō),nodejs已經(jīng)不是一個(gè)陌生的詞眼,下面這篇文章主要給大家介紹了關(guān)于Windows系統(tǒng)下Node.js安裝以及環(huán)境配置的完美教程,需要的朋友可以參考下
    2022-06-06
  • 使用cluster 將自己的Node服務(wù)器擴(kuò)展為多線程服務(wù)器

    使用cluster 將自己的Node服務(wù)器擴(kuò)展為多線程服務(wù)器

    nodejs在v0.6.x之后 增加了一個(gè)模塊 cluster 用于實(shí)現(xiàn)多進(jìn)程,利用child_process模塊來(lái)創(chuàng)建和管理進(jìn)程,增加程序在多核CPU機(jī)器上的性能表現(xiàn)。本文將介紹利用cluster模塊創(chuàng)建的多線程的問(wèn)題。
    2014-11-11
  • Node.js中的事件驅(qū)動(dòng)編程詳解

    Node.js中的事件驅(qū)動(dòng)編程詳解

    這篇文章主要介紹了Node.js中的事件驅(qū)動(dòng)編程詳解,本文主要講解理論性知識(shí),如什么是事件驅(qū)動(dòng)編程、什么是閉包、閉包如何幫助異步編程等知識(shí),需要的朋友可以參考下
    2014-08-08
  • NodeJS?Express使用ORM模型訪問(wèn)關(guān)系型數(shù)據(jù)庫(kù)流程詳解

    NodeJS?Express使用ORM模型訪問(wèn)關(guān)系型數(shù)據(jù)庫(kù)流程詳解

    這篇文章主要介紹了NodeJS?Express使用ORM模型訪問(wèn)關(guān)系型數(shù)據(jù)庫(kù)流程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2023-01-01
  • node進(jìn)程管理工具PM2用法詳解

    node進(jìn)程管理工具PM2用法詳解

    本文詳細(xì)講解了node進(jìn)程管理工具PM2的用法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06

最新評(píng)論