Node js中的请求响应周期如何与外部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 Worldn");
});
// 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/");

真正简单的代码,其中服务器使用简单的HTTP响应响应HTTP请求,并带有纯文本" Hello World"

我还准备好库从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请求的回调中更改响应节点的状态。到那时,响应是否已经发送到事件循环?一个人如何模拟此系统中的同步请求,以便您可以使用API请求的响应将响应发送给客户端?

由于必须是单线螺纹,因此如何在HTTP API请求的回调中更改响应node.js的状态?

因为未收到请求的响应未同步发送。

到那时,响应是否已发送到事件循环?

直到您致电res.send或类似的响应,该响应才能从作业队列中触发您的请求回调  mdash;而且经常不是。

一个人如何模拟此系统中的同步请求,以便您可以使用API请求的响应将响应发送给客户端?

没有必要,这样做会杀死吞吐量。

在任何给定的线程上(nodejs仅使用一个),JavaScript根据A job Queue :单个JavaScript线程从排队中拾取作业,运行代码,运行代码来运行代码它一直通过,然后从队列中捡起下一个作业(或闲置直到添加一个作业)。事件发生或类似时,如果您已经为该事件设置了一个处理程序,则将对处理程序的呼叫添加到工作队列中。(实际上,工作队列至少有两层;如果您有兴趣,请参阅此答案。)

,如果您不从代码中的"我们收到的HTTP请求"响应"您的处理程序的作业"中的"我们收到了HTTP请求",这是绝对可以的。这是完全正常的。工作和请求完全彼此分离。因此,如果您启动异步过程(例如getreadFile),则很好(正常)。稍后,当该过程的结果可用时,将新作业添加到队列中,JavaScript线程将其拾取,您使用res.send或类似的内容来回复一直在等待的请求。

这是nodejs尽管只有一个线程,但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);
});

最新更新