NodeJS http服务器,待挂请求阻塞服务器



我正在做实验,我面临着一个我无法理解的限制。这就是我想要达到的目标:

用户请求一条路由,其输出可能需要~10秒来计算。其他一些并发请求可能会触发完全相同的路由。为了避免对每个请求运行计算,我将所有这些请求存储到一个数组中。一旦计算完成,它的输出将被发送到所有存储请求的响应中。

这段代码没有按预期工作:

  • 第一个请求将派生一个子进程,并在响应之前运行10秒的计算。
  • 第二个请求,在第一个请求发送后2秒,将看到它的响应存储,然后在子进程结束计算后结束。
  • 第2次请求后2秒发送第3次请求。子进程仍在计算。但这就是它失败的地方。执行将在console.log("Incoming request") "之前暂停,而不是稍后存储响应。直到请求1和请求2完成他们的事情。

我真的不明白发生了什么事。这就像服务器被阻塞,直到两个挂起的请求结束。但是我不能相信NodeJS并发连接被限制在2。

. js

const { fork }      = require("child_process");
const http          = require('http');
var store = [];
http.createServer((request, response) => {    
console.log("Incoming request");

if(store.length === 0){ // First request
store.push(response);  
let child = fork( __dirname+'/fork.js');
child.on('message', (message) => {                       

if( message === "over" ){             

store.forEach( (response) =>{
response.end(message);
});     
store = [];
}
});
child.send('start');  
}
else{ // Child process is already calculating

store.push(response);    
}              
}).listen(8181, () => {
console.log('server running');
});

fork.js

const child = require('child_process');
process.on('message', (message) => {
// Send a shell cmd that sleeps for 10 seconds
child.exec('sleep 10', 
(error, stdout, stderr) => {
process.send("over");               
}
);
});

早期版本的node.js有5个同时连接的限制,准确地说是v0.10或更早的版本。您正在运行的代码的应用服务器规范是什么,即内存、CPU内核?

https://tpiros.dev/blog/concurrent-http-connections-in-node-js/

最新更新