我有一个简单的 http 服务器,但它在服务请求之前会执行一些阻塞操作。因此,我认为如果其中一个子进程陷入阻塞进程,则 fork 一些子进程应该能够处理更多请求。
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 个 fork 。但它总是停留在只处理 1 个请求上。如果我同时打开 2 个或更多指向该地址的选项卡,我至少应该能够在控制台中立即多次看到 req get
,对吗?但我只见过1次。所有其他请求都无法被其他可能空闲的 fork 接收。
Server listening on port 80
Server listening on port 80
Server listening on port 80
req get
只有当其中一个死亡时,我才会看到另一个 fork 正在处理待处理的请求
FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - process out of memory
req get
Server listening on port 80
当其中一个 fork 陷入阻塞操作时,是什么阻止我的其他 fork 监听新请求?
最佳答案
这里的问题不在 Node 中。尝试使用curl
或类似工具发出并行请求。您将看到,正如预期的那样,每个进程一次处理一个请求,总共 3 个并发请求。
这里的问题是您的浏览器。从测试来看,浏览器似乎不愿意一次向同一域发出多个并发请求。
但是,我找不到这方面的文档 - 似乎大多数浏览器都旨在为每个域发出至少 2 个(有时甚至更多)并发请求。这可能是本地主机上的特例 - 当我将本地服务器代理到远程计算机并通过远程域请求它时,我看到不同的行为。
关于node.js - 当其中一个 fork 陷入阻塞操作时,其他集群 fork 无法获取请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31040895/