节点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 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/"); 

真正简单的代码,服务器通过简单的HTTP响应以纯文本“Hello World”响应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请求,然后在callback中做一些响应。

如果有人在HTTP请求到达node.js服务器时发出这样的API请求,会发生什么情况? 由于stream程必须是单线程的,所以如何改变响应的状态node.js在HTTP API请求的callback中发送给客户端? 那么到底是不是将响应发送到事件循环? 如何模拟这个系统中的同步请求,以便您可以使用API​​请求的响应来向客户端发送响应?

由于stream程必须是单线程的,所以如何改变响应的状态node.js在HTTP API请求的callback中发送给客户端?

因为响应不是与接收到的请求同步发送的。

那么到底是不是将响应发送到事件循环?

直到你调用res.send或者类似的东西,这个响应才会被发送,而这个响应不一定要和触发你的请求callback的作业队列处于同一个作业中 – 而且通常不是。

如何模拟这个系统中的同步请求,以便您可以使用API​​请求的响应来向客户端发送响应?

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

在任何给定的线程上(并且NodeJS只使用一个),JavaScript在作业队列的基础上工作 :单个JavaScript线程通过从队列中拾取作业,一直运行代码,然后拾取从队列中的下一个作业(或闲置直到添加一个)。 当事件进入或类似时,如果您为该事件设置了处理程序,则将对处理程序的调用添加到作业队列中。 (实际上至less有两层到工作队列;如果您有兴趣,请参阅这个答案 。

如果你没有对代码中的“我们得到了一个HTTP请求”作出响应,那么这是非常好的。 这很正常。 工作和要求完全分离。 所以如果你启动一个asynchronous进程(比如get或者readFilereadFile 。 稍后,如果该进程的结果可用,则会将新作业添加到队列中,JavaScript线程将其拾取,然后使用res.send或类似的方法来回复正在等待的请求。

这就是NodeJS如何pipe理高吞吐量,尽pipe只有一个线程:如果在整个过程中使用asynchronousI / O,实际的代码不必占用线程,因为它不会等待I / O去完成。 当I / O挂起时,它可以在其他事情上做更多的工作,然后在I / O完成时作出响应。