在服务器端,我有这个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_tick_data_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
}
答案 0 :(得分:0)
快递请求'关闭'事件意味着连接已关闭(我相信express request inherits来自基础http.IncomingMessage
。
这可能是因为客户放弃了,或者是因为nodejs socket timeout hit 2 minutes。
您需要弄清楚连接的哪一侧放弃了。我会认为这是客户端,但发现nodejs超时后感到惊讶。有关在请求套接字上设置套接字超时的信息,请参阅http://nodejs.org/api/http.html#http_request_setsocketkeepalive_enable_initialdelay。
另请参阅:node.js http.IncomingMessage does not fire 'close' event