[英]How does Node keep a server process alive?
真正的答案最終來自於從事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服務器將關閉或變為死機。
當下面的代碼執行時:
server.listen()
如果有任何新數據到此處,它只是注冊偵聽端口。 在TCP / IP中,當客戶端調用服務器時,他們基本上在服務器PORT上寫了他們的任務(為了便於解釋,我說它)。 由於服務器處理正在偵聽端口的更改,因此它可以對此進行響應。 如果您了解節點事件的工作原理,希望您了解服務器進程如何同時管理許多請求。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.