2

如果我有一个运行 Node.js 的 Web 服务器,那么我可以同时处理多个请求吗?从我的初步测试中我可以看到,主要是单线程的 Node 目前只能处理一个 HTTP 请求。但是如果一个请求完成的时间太长(例如,上传大量数据),那么所有其他请求都必须等待。

这种情况有解决方法吗?我们能否编写代码使其可以同时处理多个 HTTP 请求?

4

3 回答 3

7

Node 是单线程的这一事实并不一定意味着它一次只能处理 1 个请求。

Node 中的很多东西都是故意异步的。例如许多文件系统操作、数据库查询等。这是以下心态:

我知道你会花一些时间来做这件事,所以当你完成后打电话给我,同时我会更好地使用我的单线程操作,而不是等待你完成.

正是在这一点上处理其他工作(可以是其他请求)。当然,如果他们必须执行异步操作,操作流程可能会回到我们之前暂停的地方,因为其他操作已经完成。

在您进行大量上传的情况下,传入流将异步处理并通过dataevent进行管理。如果您想将此流写入磁盘,同样可以异步执行写入;即在文件上传过程中有一些点可以处理其他请求。

只有当你有多个 CPU 内核时,拥有多个操作线程才是有益的;然后每个操作线程可以在不同的核心上运行。为此,Node 具有你应该查看的cluster模块。

于 2013-03-03T21:49:08.267 回答
2

正如我们在 node.js 中看到的,我们有一个非阻塞 I/O 服务器平台。所以我们可以同时服务多个请求。例如:-

将文件处理视为一个案例:-

var fs=require("fs");
console.log("starting");
fs.readFile("path-to-file", function(error, data){
    console.log("Content:"+data);
});
console.log("Carry on executing");

输出:-

starting
carry on executing
Content: data

所以我们可以看到,当我们等待文件的内容时,我们的代码将继续执行

于 2013-03-04T20:50:44.193 回答
0

当请求需要很长时间时,这并不是因为处理器需要很长时间来处理请求。这是因为它要花很长时间等待每一块数据进来。正是在这个等待时间内,node.js 可以处理其他请求,这使得它非常具有可扩展性,并且比大多数其他平台使用的线程模型效率更高. 有关详细讨论,请参阅Dan Kegel的 C10k 问题

JavaScript 事件通过有一个事件队列来工作。每次触发事件(例如文件读取操作或来自服务器请求的数据块)时,都会添加此队列。只要生成的事件处理代码不是处理器密集型的,队列通常不会变得很长,并且代码几乎立即执行。这就是为什么 node.js 中几乎所有东西都是异步的。

于 2013-03-03T21:53:35.633 回答