簡體   English   中英

節點js中的請求響應周期如何與外部I / O一起工作

[英]How the request response cycle in node js works with external I/O

在此處完成node.js初學者。 我在某個地方看到了這個“ hello world”的例子

// Load the http module to create an http server.
var http = require('http');

// Configure our HTTP server to respond with Hello World to all requests.
var server = http.createServer(function (request, response) {
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.end("Hello World\n");
});

// Listen on port 8000, IP defaults to 127.0.0.1
server.listen(8000);

// Put a friendly message on the terminal
console.log("Server running at http://127.0.0.1:8000/");

真正簡單的代碼,其中服務器使用純文本“ Hello World”的簡單HTTP響應來響應HTTP請求

我還准備好一個庫,以通過javascript發出HTTP請求

http.get(options, function(resp){
  resp.on('data', function(chunk){
    //do something with chunk
  });
}).on("error", function(e){
  console.log("Got error: " + e.message);
});

在這里,您可以使用一些選項發出HTTP請求,然后對回調中的響應進行處理。

如果當HTTP請求到達node.js服務器時發出了這樣的API請求,會發生什么? 由於流必須是單線程的,因此如何在HTTP API請求的回調中更改node.js發送到客戶端的響應狀態? 屆時響應是否已發送到事件循環? 如何在該系統中模擬同步請求,以便您可以使用API​​請求的響應將響應發送給客戶端?

由於流必須是單線程的,因此如何在HTTP API請求的回調中更改node.js發送到客戶端的響應狀態?

因為響應不是與已接收到的請求同步發送的。

屆時響應是否已發送到事件循環?

除非您調用res.send或類似命令,否則不會發送響應,該響應不必與觸發您的請求回調的作業隊列中的同一作業相同-經常不是這樣。

如何在該系統中模擬同步請求,以便您可以使用API​​請求的響應將響應發送給客戶端?

無需這樣做,這樣做會導致吞吐量下降。

在任何給定線程上(NodeJS僅使用一個),JavaScript均基於作業隊列工作 :單個JavaScript線程的工作方式是從隊列中拾取作業,一直運行代碼,然后進行拾取隊列中的下一個作業(或閑置直到添加一個)。 當發生事件或類似事件時,如果您為該事件設置了處理程序,則對處理程序的調用將添加到作業隊列中。 (實際上,作業隊列至少有兩層;如果您有興趣,請參閱此答案以獲取更多信息。)

如果您不從調用您的處理程序的工作的代碼中響應“我們收到HTTP請求”,那絕對沒問題。 完全正常。 作業和請求完全彼此分離。 因此,如果您啟動異步進程(如getreadFile ),那就很好(並且是正常的)。 稍后,當該過程的結果可用時,一個新的作業將被添加到隊列中,JavaScript線程將其拾取,然后您使用res.send或類似的方法來答復正在等待的請求。

這是NodeJS即使只有一個線程也可以管理高吞吐量的方式:如果您始終使用異步I / O,則您的實際代碼不必這么長時間就占用線程,因為它不需要等待I / O去完成。 在I / O待處理時,它可以做其他事情,然后在I / O完成時對其做出響應。

您需要像這樣更改代碼:

http.get(options, function(resp){
  resp.on('data', function(chunk){
    resp.send(chunk);
  });
}).on("error", function(e){
  console.log("Got error: " + e.message);
});

暫無
暫無

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

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