2013-03-03 70 views
2

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

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

+2

如果您的应用程序一次只能处理一个HTTP请求,那么您做错了什么。具体来说,确保你没有使用任何*'Sync'方法。 – josh3736 2013-03-03 23:34:20

回答

7

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

很多东西在Node中是故意异步的;如许多文件系统操作,数据库查询等,这是的心态:

我知道你会需要一些时间来做到这一点,所以打电话给我,当你完成,在此期间,我将会使我的单线程操作更好地使用,而不是等你完成。

就是在其它工作(其可以是其他请求)被处理了这一点。当然,如果他们然后必须执行异步操作,操作流可能会返回到我们早先暂停我们的位置,因为其他操作已完成。

在您发生大量上传的情况下,传入流将被异步处理并通过data event进行管理。如果你想将这个流写入磁盘,请再次输入:writing can be performed asynchronously;即在可以处理其他请求的文件上传过程中存在点。

如果您有多个CPU核心,多线程操作只会有好处;那么每个操作线程都可以运行在不同的核心上。要做到这一点,节点有cluster module,你应该看看。

0

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

JavaScript事件通过拥有一个事件队列来工作。每当事件(例如文件读取操作或来自服务器请求的数据块)触发时,该队列就会被添加。只要结果事件处理代码不是处理器密集程度太高,队列通常不会很长,并且代码几乎立即执行。这就是为什么几乎node.js中的所有内容都是异步的。

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"); 

OUTPUT: -

starting 
carry on executing 
Content: data 

所以我们可以看到,虽然我们正在等待文件中向我们代码的内容将继续执行