Node.js nodejs-运行多个子进程,但某些请求意外关闭

Node.js nodejs-运行多个子进程,但某些请求意外关闭,node.js,sockets,http,io,multiprocessing,Node.js,Sockets,Http,Io,Multiprocessing,在服务器端,我有这个nodejs代码。我在这里简化了代码以明确问题: var express = require('express'); var app = express(); var spawn = require('child_process').spawn; app.get('/print_N', function(req, res) { var child = spawn('python', ['some_tick_data_process.py']); req.o

在服务器端,我有这个nodejs代码。我在这里简化了代码以明确问题:

var express = require('express');
var app = express();
var spawn = require('child_process').spawn;

app.get('/print_N', function(req, res) {
    var child = spawn('python', ['some_tick_data_process.py']);

    req.on('close', function() {
        console.log('req to close with pid=' + child.pid);
        child.kill('SIGTERM');
    });

    child.stdout.pipe(res);
    child.stdout.on('error', function(err) {
        console.log(child.pid + " error !!!")
        console.log(err);
    });
});
app.listen(3000);
console.log('Listening on port 3000...');
底层的
some\u tick\u data\u process.py
相当I/O密集。在客户端,我有一个小型python应用程序来读取流。问题是某些进程将运行到错误
“req to close”
。只需少量的过程,就可以了。我试过:

var http = require('http');
http.globalAgent.maxSockets = 100;
但这没用。请分享你的想法,谢谢

在充分利用p.T.的建议后,解决方案是:

app.get('/:version/query', function(req, res) {
    res.setTimeout(4 * 60 * 60 * 1000);  // nodejs socket timeout 4-hour
}

express request“close”事件表示连接已关闭(我相信是从底层开始的)

这可能是因为客户放弃了,也可能是因为

您需要找出连接的哪一方正在放弃。我本以为是客户端,但意外地发现nodejs超时。有关在请求的套接字上设置套接字超时的信息,请参阅


另请参见:

不,您不可能让python在浏览器中运行,因此python也在服务器端运行。您的节点脚本只是在生成它。node.js的全部要点是它可以异步工作,并且它是一个无限运行的进程,因此您没有理由跳转到python脚本,真的。只需编写您的节点代码做正确的事情。(Node.js不会在您编写响应后“停止运行”,也不会退出
get
route处理程序。您启动async的任何代码仍在运行。)Mike,您说的“一些数据\u process.py”是对的是在服务器端运行的。我修改了我的帖子以澄清这一点。此过程解析一些数据,每个数据通常在一分钟内完成。请注意:不要让web请求产生长时间运行的进程。这不是web服务器的用途,它使您的服务器成为一个微不足道的DOS目标。还请解释一些\u tick\u数据\u过程s、 py可以,因为它几乎肯定会做一些你应该使用
cron
或类似的东西,而不是重载web请求作为触发器。嗨,Mike,我们在intranet上有一个交易回溯测试系统,所以安全性不是问题。回溯测试代码在研究人员的桌面上运行,但它需要来自服务器的数据。服务器使用NoDE.js将数据传递到ButTestCalp。有更好的建议吗?您可能想考虑在Bothon服务器上运行自己的Python服务器,运行在研究人员的桌面上(这样就不受PHP执行限制的限制)。,当请求传入时,您只需让主服务器对python服务发出一个send and forget调用即可。研究人员的机器运行长时间运行的任务,而不会干扰您的真实服务器。您好,P.T.,谢谢!让我更改这些设置并测试一下。