我正在做实验,我面临着一个我无法理解的限制。这就是我想要达到的目标:
用户请求一条路由,其输出可能需要~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/