如果我有一个运行Node.js的Web服务器,那么我是否可以同时提供多个请求?从我的初步测试中我可以看到,Node主要是单线程的,目前只能处理一个HTTP请求。但是如果一个请求花费很长时间才能完成(例如,上传大量数据),那么所有其他请求都必须等待。Node.js Web服务器中的并行请求
有没有解决这种情况的解决方法?我们可以编写代码,以便它可以同时处理多个HTTP请求吗?
如果我有一个运行Node.js的Web服务器,那么我是否可以同时提供多个请求?从我的初步测试中我可以看到,Node主要是单线程的,目前只能处理一个HTTP请求。但是如果一个请求花费很长时间才能完成(例如,上传大量数据),那么所有其他请求都必须等待。Node.js Web服务器中的并行请求
有没有解决这种情况的解决方法?我们可以编写代码,以便它可以同时处理多个HTTP请求吗?
Node单线程并不一定意味着它一次只能处理1个请求。
很多东西在Node中是故意异步的;如许多文件系统操作,数据库查询等,这是的心态:
我知道你会需要一些时间来做到这一点,所以打电话给我,当你完成,在此期间,我将会使我的单线程操作更好地使用,而不是等你完成。
就是在其它工作(其可以是其他请求)被处理了这一点。当然,如果他们然后必须执行异步操作,操作流可能会返回到我们早先暂停我们的位置,因为其他操作已完成。
在您发生大量上传的情况下,传入流将被异步处理并通过data
event进行管理。如果你想将这个流写入磁盘,请再次输入:writing can be performed asynchronously;即在可以处理其他请求的文件上传过程中存在点。
如果您有多个CPU核心,多线程操作只会有好处;那么每个操作线程都可以运行在不同的核心上。要做到这一点,节点有cluster
module,你应该看看。
当请求需要很长时间时,这不是因为处理器花费很长时间来处理请求。这是因为它花费很长时间来等待每个数据块进来。在这个等待时间内,node.js可以处理其他请求,这使得它非常具有可伸缩性,并且比大多数其他平台使用的线程模型效率更高。有关详细讨论,请参阅Dan Kegel的the C10k problem。
JavaScript事件通过拥有一个事件队列来工作。每当事件(例如文件读取操作或来自服务器请求的数据块)触发时,该队列就会被添加。只要结果事件处理代码不是处理器密集程度太高,队列通常不会很长,并且代码几乎立即执行。这就是为什么几乎node.js中的所有内容都是异步的。
正如我们在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
所以我们可以看到,虽然我们正在等待文件中向我们代码的内容将继续执行
如果您的应用程序一次只能处理一个HTTP请求,那么您做错了什么。具体来说,确保你没有使用任何*'Sync'方法。 – josh3736 2013-03-03 23:34:20