当其中一个叉子卡在阻塞操作中时,其他集群分叉无法获得请求

我有一个简单的HTTP服务器,但它提供一个请求前做了一些阻塞操作。 所以我认为分几个subprocess应该处理更多的请求,如果其中一个被阻塞进程。

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个请求。 如果我同时打开2个或更多的选项卡,我应该至less能够看到req get在控制台中瞬间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 

什么阻止我的其他叉子听到新的请求时,其中一个叉卡住了阻塞操作?

这里的问题不在节点中。 尝试使用curl或类似的工具进行并行请求。 您将会看到,如预期的那样,每个进程一次处理一个请求,共发出3个并发请求。

这里的问题是你的浏览器。 从testing看来,浏览器似乎不愿意同时向同一个域发出多个并发请求。

但是,我无法find这种效果的文档 – 看起来大多数浏览器的目的是为每个域创build至less2个,甚至更多的并发请求。 这可能是本地主机上的一种特殊情况 – 当我将本地服务器代理到远程计算机并通过远程域请求时,我会看到不同的行为。