gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:34:10 24 4
gpt4 key购买 nike

在服务器端,我有这个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
}

最佳答案

明确请求“关闭”事件意味着连接已关闭(我相信 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

关于node.js - Node js - 运行多个child_process,但某些请求意外关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24050278/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com