node js - 运行多个child_process,但有些请求意外关闭

时间:2014-06-05 01:40:06

标签: 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.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
}

1 个答案:

答案 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