我有一个简单的http服务器,但它在提供请求之前会执行一些阻止操作。因此,我认为如果其中一个进程陷入阻塞过程,那么分配一些子进程应该会处理更多请求。
var cluster = require('cluster');
if (cluster.isMaster) {
cluster.on('exit', cluster.fork);
cluster.fork(); cluster.fork(); cluster.fork();
return;
}
var http = require('http');
http.createServer(function(req, res) {
console.log('req get');
var i = 0;
while (i++ < 100000000) setTimeout(); // blocking operation
res.end('Hello World\n');
console.log('req served');
}).listen(80);
console.log('Server listening on port 80');
它开始3个叉子。但它始终只是处理1个请求。如果我同时打开两个或多个指向该地址的标签,我至少应该能够在控制台中看到req get
那么多次,对吧?但我只看到它一次。所有其他请求无法通过可能空闲的其他分支接收。
Server listening on port 80
Server listening on port 80
Server listening on port 80
req get
只有当其中一个人死亡时,我才会看到另一个叉子接收待处理的请求
FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - process out of memory
req get
Server listening on port 80
当其中一个分支卡在阻塞操作中时,什么阻止我的其他分支听取新请求?
答案 0 :(得分:1)
这里的问题不在节点中。尝试使用curl
或类似工具发出并行请求。您将看到,正如预期的那样,每个进程一次处理一个请求,总共有3个并发请求。
这里的问题是您的浏览器。从测试开始,浏览器似乎不愿意一次向同一个域发出多个并发请求。
但是,我找不到这方面的文档 - 似乎大多数浏览器都打算每个域至少发出2个,有时甚至更多的并发请求。这可能是localhost上的一个特例 - 当我将本地服务器代理到远程计算机并通过远程域请求它时,我看到了不同的行为。