如果我有一个运行 Node.js 的 Web 服务器,那么我可以同时处理多个请求吗?从我的初步测试中我可以看到,主要是单线程的 Node 目前只能处理一个 HTTP 请求。但是如果一个请求完成的时间太长(例如,上传大量数据),那么所有其他请求都必须等待。
这种情况有解决方法吗?我们能否编写代码使其可以同时处理多个 HTTP 请求?
如果我有一个运行 Node.js 的 Web 服务器,那么我可以同时处理多个请求吗?从我的初步测试中我可以看到,主要是单线程的 Node 目前只能处理一个 HTTP 请求。但是如果一个请求完成的时间太长(例如,上传大量数据),那么所有其他请求都必须等待。
这种情况有解决方法吗?我们能否编写代码使其可以同时处理多个 HTTP 请求?
Node 是单线程的这一事实并不一定意味着它一次只能处理 1 个请求。
Node 中的很多东西都是故意异步的。例如许多文件系统操作、数据库查询等。这是以下心态:
我知道你会花一些时间来做这件事,所以当你完成后打电话给我,同时我会更好地使用我的单线程操作,而不是等待你完成.
正是在这一点上处理其他工作(可以是其他请求)。当然,如果他们必须执行异步操作,操作流程可能会回到我们之前暂停的地方,因为其他操作已经完成。
在您进行大量上传的情况下,传入流将异步处理并通过data
event进行管理。如果您想将此流写入磁盘,同样可以异步执行写入;即在文件上传过程中有一些点可以处理其他请求。
只有当你有多个 CPU 内核时,拥有多个操作线程才是有益的;然后每个操作线程可以在不同的核心上运行。为此,Node 具有你应该查看的cluster
模块。
正如我们在 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
所以我们可以看到,当我们等待文件的内容时,我们的代码将继续执行
当请求需要很长时间时,这并不是因为处理器需要很长时间来处理请求。这是因为它要花很长时间等待每一块数据进来。正是在这个等待时间内,node.js 可以处理其他请求,这使得它非常具有可扩展性,并且比大多数其他平台使用的线程模型效率更高. 有关详细讨论,请参阅Dan Kegel的 C10k 问题。
JavaScript 事件通过有一个事件队列来工作。每次触发事件(例如文件读取操作或来自服务器请求的数据块)时,都会添加此队列。只要生成的事件处理代码不是处理器密集型的,队列通常不会变得很长,并且代码几乎立即执行。这就是为什么 node.js 中几乎所有东西都是异步的。