欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

nodejs中怎么創(chuàng)建cluster

本篇文章為大家展示了nodejs中怎么創(chuàng)建cluster,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

創(chuàng)新互聯(lián)專(zhuān)業(yè)成都做網(wǎng)站、成都網(wǎng)站制作,集網(wǎng)站策劃、網(wǎng)站設(shè)計(jì)、網(wǎng)站制作于一體,網(wǎng)站seo、網(wǎng)站優(yōu)化、網(wǎng)站營(yíng)銷(xiāo)、軟文發(fā)稿等專(zhuān)業(yè)人才根據(jù)搜索規(guī)律編程設(shè)計(jì),讓網(wǎng)站在運(yùn)行后,在搜索中有好的表現(xiàn),專(zhuān)業(yè)設(shè)計(jì)制作為您帶來(lái)效益的網(wǎng)站!讓網(wǎng)站建設(shè)為您創(chuàng)造效益。

cluster集群

我們知道,nodejs的event loop或者說(shuō)事件響應(yīng)處理器是單線(xiàn)程的,但是現(xiàn)在的CPU基本上都是多核的,為了充分利用現(xiàn)代CPU多核的特性,我們可以創(chuàng)建cluster,從而使多個(gè)子進(jìn)程來(lái)共享同一個(gè)服務(wù)器端口。

也就是說(shuō),通過(guò)cluster,我們可以使用多個(gè)子進(jìn)程來(lái)服務(wù)處理同一個(gè)端口的請(qǐng)求。

先看一個(gè)簡(jiǎn)單的http server中使用cluster的例子:

const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  console.log(`主進(jìn)程 ${process.pid} 正在運(yùn)行`);

  // 衍生工作進(jìn)程。
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  cluster.on('exit', (worker, code, signal) => {
    console.log(`工作進(jìn)程 ${worker.process.pid} 已退出`);
  });
} else {
  // 工作進(jìn)程可以共享任何 TCP 連接。
  // 在本例子中,共享的是 HTTP 服務(wù)器。
  http.createServer((req, res) => {
    res.writeHead(200);
    res.end('你好世界\n');
  }).listen(8000);

  console.log(`工作進(jìn)程 ${process.pid} 已啟動(dòng)`);
}

cluster詳解

cluster模塊源自于lib/cluster.js,我們可以通過(guò)cluster.fork()來(lái)創(chuàng)建子工作進(jìn)程,用來(lái)處理主進(jìn)程的請(qǐng)求。

cluster中的event

cluster繼承自events.EventEmitter,所以cluster可以發(fā)送和接收event。

cluster支持7中event,分別是disconnect,exit,fork,listening,message,online和setup。

在講解disconnect之前,我們先介紹一個(gè)概念叫做IPC,IPC的全稱(chēng)是Inter-Process Communication,也就是進(jìn)程間通信。

IPC主要用來(lái)進(jìn)行主進(jìn)程和子進(jìn)程之間的通信。一個(gè)工作進(jìn)程在創(chuàng)建后會(huì)自動(dòng)連接到它的主進(jìn)程。 當(dāng) 'disconnect' 事件被觸發(fā)時(shí)才會(huì)斷開(kāi)連接。

觸發(fā)disconnect事情的原因有很多,可以是主動(dòng)調(diào)用worker.disconnect(),也可以是工作進(jìn)程退出或者被kill掉。

cluster.on('disconnect', (worker) => {
  console.log(`工作進(jìn)程 #${worker.id} 已斷開(kāi)連接`);
});

exit事件會(huì)在任何一個(gè)工作進(jìn)程關(guān)閉的時(shí)候觸發(fā)。一般用來(lái)監(jiān)測(cè)cluster中某一個(gè)進(jìn)程是否異常退出,如果退出的話(huà)使用cluster.fork創(chuàng)建新的進(jìn)程,以保證有足夠多的進(jìn)程來(lái)處理請(qǐng)求。

cluster.on('exit', (worker, code, signal) => {
  console.log('工作進(jìn)程 %d 關(guān)閉 (%s). 重啟中...',
              worker.process.pid, signal || code);
  cluster.fork();
});

fork事件會(huì)在調(diào)用cluster.fork方法的時(shí)候被觸發(fā)。

const timeouts = [];
function errorMsg() {
  console.error('連接出錯(cuò)');
}

cluster.on('fork', (worker) => {
  timeouts[worker.id] = setTimeout(errorMsg, 2000);
});

主進(jìn)程和工作進(jìn)程的listening事件都會(huì)在工作進(jìn)程調(diào)用listen方法的時(shí)候觸發(fā)。

cluster.on('listening', (worker, address) => {
  console.log(
    `工作進(jìn)程已連接到 ${address.address}:${address.port}`);
});

其中worker代表的是工作線(xiàn)程,而address中包含三個(gè)屬性:address、 port 和 addressType。 其中addressType有四個(gè)可選值:

  • 4 (TCPv4)

  • 6 (TCPv6)

  • -1 (Unix 域 socket)

  • 'udp4' or 'udp6' (UDP v4 或 v6)

message事件會(huì)在主進(jìn)程收到子進(jìn)程發(fā)送的消息時(shí)候觸發(fā)。

當(dāng)主進(jìn)程生成工作進(jìn)程時(shí)會(huì)觸發(fā)fork,當(dāng)工作進(jìn)程運(yùn)行時(shí)會(huì)觸發(fā)online。

setupMaster方法被調(diào)用的時(shí)候,會(huì)觸發(fā)setup事件。

cluster中的方法

cluster中三個(gè)方法,分別是disconnect,fork和setupMaster。

cluster.disconnect([callback])

調(diào)用cluster的disconnect方法,實(shí)際上會(huì)在cluster中的每個(gè)worker中調(diào)用disconnect方法。從而斷開(kāi)worker和主進(jìn)程的連接。

當(dāng)所有的worker都斷開(kāi)連接之后,會(huì)執(zhí)行callback。

cluster.fork([env])

fork方法,會(huì)從主進(jìn)程中創(chuàng)建新的子進(jìn)程。其中env是要添加到進(jìn)程環(huán)境變量的鍵值對(duì)。

fork將會(huì)返回一個(gè)cluster.Worker對(duì)象,代表工作進(jìn)程。

最后一個(gè)方法是setupMaster:

cluster.setupMaster([settings])

默認(rèn)情況下,cluster通過(guò)fork方法來(lái)創(chuàng)建子進(jìn)程,但是我們可以通過(guò)setupMaster來(lái)改變這個(gè)行為。通過(guò)設(shè)置settings變量,我們可以改變后面fork子進(jìn)程的行為。

我們看一個(gè)setupMaster的例子:

const cluster = require('cluster');
cluster.setupMaster({
  exec: 'worker.js',
  args: ['--use', 'https'],
  silent: true
});
cluster.fork(); // https 工作進(jìn)程
cluster.setupMaster({
  exec: 'worker.js',
  args: ['--use', 'http']
});
cluster.fork(); // http 工作進(jìn)程

cluster中的屬性

通過(guò)cluster對(duì)象,我們可以通過(guò)isMaster和isWorker來(lái)判斷進(jìn)程是否主進(jìn)程。

可以通過(guò)worker來(lái)獲取當(dāng)前工作進(jìn)程對(duì)象的引用:

const cluster = require('cluster');

if (cluster.isMaster) {
  console.log('這是主進(jìn)程');
  cluster.fork();
  cluster.fork();
} else if (cluster.isWorker) {
  console.log(`這是工作進(jìn)程 #${cluster.worker.id}`);
}

可以通過(guò)workers來(lái)遍歷活躍的工作進(jìn)程對(duì)象:

// 遍歷所有工作進(jìn)程。
function eachWorker(callback) {
  for (const id in cluster.workers) {
    callback(cluster.workers[id]);
  }
}
eachWorker((worker) => {
  worker.send('通知所有工作進(jìn)程');
});

每個(gè)worker都有一個(gè)id編號(hào),用來(lái)定位該worker。

cluster中的worker

worker類(lèi)中包含了關(guān)于工作進(jìn)程的所有的公共的信息和方法。cluster.fork出來(lái)的就是worker對(duì)象。

worker的事件和cluster的很類(lèi)似,支持6個(gè)事件:disconnect,error,exit,listening,message和online。

worker中包含3個(gè)屬性,分別是:id,process和exitedAfterDisconnect。

其中id是worker的唯一標(biāo)記。

worker中的process,實(shí)際上是ChildProcess對(duì)象,是通過(guò)child_process.fork()來(lái)創(chuàng)建出來(lái)的。

因?yàn)樵趙orker中,process屬于全局變量,所以我們可以直接在worker中使用process來(lái)進(jìn)行發(fā)送消息。

exitedAfterDisconnect表示如果工作進(jìn)程由于 .kill() 或 .disconnect() 而退出的話(huà),值就是true。如果是以其他方式退出的話(huà),返回值就是false。如果工作進(jìn)程尚未退出,則為 undefined。

我們可以通過(guò)worker.exitedAfterDisconnect 來(lái)區(qū)分是主動(dòng)退出還是被動(dòng)退出,主進(jìn)程可以根據(jù)這個(gè)值決定是否重新生成工作進(jìn)程。

cluster.on('exit', (worker, code, signal) => {
  if (worker.exitedAfterDisconnect === true) {
    console.log('這是自發(fā)退出,無(wú)需擔(dān)心');
  }
});

// 殺死工作進(jìn)程。
worker.kill();

worker還支持6個(gè)方法,分別是:send,kill,destroy,disconnect,isConnected,isDead。

這里我們主要講解一下send方法來(lái)發(fā)送消息:

worker.send(message[, sendHandle[, options]][, callback])

可以看到send方法和child_process中的send方法參數(shù)其實(shí)是很類(lèi)似的。而本質(zhì)上,worker.send在主進(jìn)程中,這會(huì)發(fā)送消息給特定的工作進(jìn)程。 相當(dāng)于 ChildProcess.send()。在工作進(jìn)程中,這會(huì)發(fā)送消息給主進(jìn)程。 相當(dāng)于 process.send()。

if (cluster.isMaster) {
  const worker = cluster.fork();
  worker.send('你好');

} else if (cluster.isWorker) {
  process.on('message', (msg) => {
    process.send(msg);
  });
}

上述內(nèi)容就是nodejs中怎么創(chuàng)建cluster,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

分享題目:nodejs中怎么創(chuàng)建cluster
路徑分享:http://www.chinadenli.net/article32/gegssc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)做網(wǎng)站企業(yè)網(wǎng)站制作標(biāo)簽優(yōu)化Google用戶(hù)體驗(yàn)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

微信小程序開(kāi)發(fā)