繁体   English   中英

Node.js Web服务器中的并行请求

[英]Parallel requests in Node.js web server

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

这种情况有解决方法吗? 我们可以编写代码,以便它可以同时服务多个HTTP请求吗?

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

Node中的很多东西都是故意异步的; 例如许多文件系统操作,数据库查询等。这是以下的思维方式:

我知道你需要花一些时间来做这件事,所以当你完成时给我打电话,同时我要把我的单线程操作更好用,而不是等你完成。

此时,处理其他工作 (可以是其他请求)。 当然,如果他们必须执行异步操作,操作流程可能会返回到我们之前暂停的位置,因为其他操作已经完成。

在发生大型上载的情况下,传入的流将以异步方式处理,并通过data事件进行管理。 如果要再将此流写入磁盘, 则可以异步执行写入操作 ; 即在文件上载过程中有一些点可以处理其他请求。

拥有多个操作线程只有在拥有多个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中的几乎所有东西都是异步的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM