簡體   English   中英

Node如何使服務器進程保持活動狀態?

[英]How does Node keep a server process alive?

當Node的事件循環完全耗盡時,該過程存在。 但是,例如,由於server.listen() ,這在HTTP服務器上不會發生。 但是這個功能究竟做了什么?

查看代碼舊的不完整答案 ,它最終調用self._listen2() ,它在process.nextTick上發出“監聽”事件,並從DefaultTriggerAsyncId()獲取異步鈎子ID。

但是,我仍然沒有得到它。 我在這里錯過了什么? 只有這段代碼如何導致事件循環保持'空閑'? 功能如何包裹在C端? 實際上這樣做的代碼行在哪里?

謝謝!

真正的答案最終來自於從事libuv工作的Bert Belder。

每當Node排隊一個將在未來的某個時刻解決的動作時,想想異步函數或定時器,它就會有一個ref - 一個標記來提醒自己它正在等待未來的某些工作。 事件循環檢查是否有任何引用。 如果ref計數器為0,則Node退出該進程。 如果有refs,則事件循環返回到開始並執行其操作。 您可以將其視為一個超級簡單的while(refCounter)循環。

那么,服務器會發生什么? 除了listen函數之外,這個精確的過程不會減少ref計數器。 事件循環看到總是至少有一個ref,所以它永遠不會結束進程而是回到開始並循環直到發生新的事情。

您可以通過在服務器對象上使用帶有net或http模塊的server.unref()來查看此信息。 在其他對象上也可用的unref方法告訴Node在事件循環結束時計數時忽略該特定函數的ref。 如果你運行下面的代碼,你會看到Node關閉進程,即使它開始監聽端口。

const http = require("http");

    http
      .createServer((req, res) => {
        res.writeHead(200);
        res.end("Bye bye");
      })
      .listen(3333)
      .unref();

讓我在這里解釋幾個步驟:1。在特定端口啟動服務器,它的作用是“它啟動一個進程,這是一個服務器進程,這個進程運行像

while(true){
   readdatafromport();
   if(unhandledexceptionHappened){
      killtheServerProcess();
     }
 }

除非發生異常,否則它會繼續讀取。 如果發生異常,則會終止服務器進程,並且您的HTTP服務器將關閉或變為死機。

  1. 當下面的代碼執行時:

      server.listen() 

    如果有任何新數據到此處,它只是注冊偵聽端口。 在TCP / IP中,當客戶端調用服務器時,他們基本上在服務器PORT上寫了他們的任務(為了便於解釋,我說它)。 由於服務器處理正在偵聽端口的更改,因此它可以對此進行響應。 如果您了解節點事件的工作原理,希望您了解服務器進程如何同時管理許多請求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM