真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

怎樣讓Nodejs服務(wù)器優(yōu)雅地退出

本篇文章為大家展示了怎樣讓Nodejs服務(wù)器優(yōu)雅地退出,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

創(chuàng)新互聯(lián)建站主要從事成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)吉隆,10多年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):028-86922220

假設(shè)我們啟動(dòng)了一個(gè)服務(wù)器,接收到了一些客戶端的請(qǐng)求,這時(shí)候,如果我們想修改一個(gè)代碼發(fā)布,需要重啟服務(wù)器,怎么辦?假設(shè)我們有以下代碼。

server.js

const net = require('net'); const server = net.createServer().listen(80);

client.js

const net = require('net'); net.connect({port:80})

如果我們直接殺死進(jìn)程,那么存量的請(qǐng)求就會(huì)無(wú)法正常被處理。這會(huì)影響我們的服務(wù)質(zhì)量。本文介紹如何使nodejs在重啟時(shí)優(yōu)雅地退出,所謂優(yōu)雅,即讓nodejs進(jìn)程處理完存量請(qǐng)求后再退出。這關(guān)鍵的地方在于nodejs提供的api  server.close()。我們看一下這api的介紹。

Stops the server from accepting new connections and keeps existing connections. This function is asynchronous, the server is finally closed when all connections are ended and the server emits a 'close' event. The optional callback will be called once the 'close' event occurs. Unlike that event, it will be called with an Error as its only argument if the server was not open when it was closed.

當(dāng)我們使用close關(guān)閉一個(gè)server時(shí),server會(huì)等所有的連接關(guān)閉后才會(huì)觸發(fā)close事件。我們看一下源碼。

Server.prototype.close = function(cb) {   // 觸發(fā)回調(diào)   if (typeof cb === 'function') {     if (!this._handle) {       this.once('close', function close() {         cb(new errors.Error('ERR_SERVER_NOT_RUNNING'));       });     } else {       this.once('close', cb);     }   }   // 關(guān)閉底層資源   if (this._handle) {     this._handle.close();     this._handle = null;   }   // 判斷是否需要立刻觸發(fā)close事件   this._emitCloseIfDrained();   return this; };  // server下的連接都close后觸發(fā)server的close事件 Server.prototype._emitCloseIfDrained = function() {   // 還有連接則先不處理   if (this._handle || this._connections) {      return;   }    const asyncId = this._handle ? this[async_id_symbol] : null;   nextTick(asyncId, emitCloseNT, this); };  Socket.prototype._destroy = function(exception, cb) {   ...   // socket所屬的server   if (this._server) {     // server下的連接數(shù)減一     this._server._connections--;     /*       是否需要觸發(fā)server的close事件,       當(dāng)所有的連接(socket)都關(guān)閉時(shí)才觸發(fā)server的是close事件     */     if (this._server._emitCloseIfDrained) {       this._server._emitCloseIfDrained();     }   } };

從源碼中我們看到,nodejs會(huì)先關(guān)閉server對(duì)應(yīng)的handle,所以server不會(huì)再接收新的請(qǐng)求了。但是server并沒(méi)有觸發(fā)close事件,而是等到所有連接斷開后才觸發(fā)close事件,這個(gè)通知機(jī)制給了我們一些思路。我們可以監(jiān)聽server的close事件,等到觸發(fā)close事件后才退出進(jìn)程。

const net = require('net'); const server = net.createServer().listen(80); server.on('close', () => {   process.exit(); }); // 防止進(jìn)程提前掛掉 process.on('uncaughtException', () => {  }); process.on('SIGINT', function() {   server.close(); })

我們首先監(jiān)聽SIGINT信號(hào),當(dāng)我們使用SIGINT信號(hào)殺死進(jìn)程時(shí),首先調(diào)用server.close,等到所有的連接斷開,觸發(fā)close時(shí)候時(shí),再退出進(jìn)程。我們首先開啟服務(wù)器,然后開啟兩個(gè)客戶端。接著按下ctrl+c,我們發(fā)現(xiàn)這時(shí)候服務(wù)器不會(huì)退出,然后我們關(guān)閉兩個(gè)客戶端,這時(shí)候server就會(huì)優(yōu)雅地退出。

上述內(nèi)容就是怎樣讓Nodejs服務(wù)器優(yōu)雅地退出,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


文章名稱:怎樣讓Nodejs服務(wù)器優(yōu)雅地退出
URL標(biāo)題:http://weahome.cn/article/gjspsh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部