节点js中创建了多个child_processes
Multiple child_processes are created in node js
我有这个节点js代码
var bat = null;
app.post("/api/run", function(req,res) {
if(!bat) {
bat = spawn('cmd.exe', ['/c App.exe']);
}
if(req.body.success) {
bat.kill();
}
bat.stdin.write(req.body.input+'\n');
bat.stdout.on('data', function (data) {
console.log(data.toString());
res.end(JSON.stringify({data: data.toString()}));
});
bat.stderr.on('data', function (data) {
console.log(data.toString());
});
bat.on('exit', function (code) {
bat = null;
console.log('Child exited with code ' + code);
});
});
这段代码假设只创建一个将 运行 exe 文件的子进程。但是在 3 ajax 请求之后,当子进程被杀死时,控制台上会输出:
Input NO: 1 You entered: input 1
Input NO: 2 You entered: input 2
Input NO: 2 You entered: input 2
Input NO: 3 You entered: input 3
Input NO: 3 You entered: input 3
Input NO: 3 You entered: input 3
Child exited with code 1
Child exited with code 1
Child exited with code 1
虽然它应该记录每个输入一次并且应该只有一个子进程。这段代码有什么问题。
任何帮助将不胜感激。谢谢
你只是在实例化一个进程,但你不断地在每个请求上连接新的事件处理程序,这就是你得到重复输出的原因(3 个请求 = 消息的 3 倍)。
将您的 .on
调用移到 if (!bat)
语句中
if (!bat) {
bat = spawn('cmd.exe', ['/c App.exe']);
bat.stdout.on('data', function (data) {
console.log(data.toString());
res.end(JSON.stringify({data: data.toString()}));
});
bat.stderr.on('data', function (data) {
console.log(data.toString());
});
bat.on('exit', function (code) {
bat = null;
console.log('Child exited with code ' + code);
});
}
bat.stdin.write(req.body.input+'\n');
实际上只有一个子进程,但是每次请求都会为子进程添加一个exit
事件监听器。所以第二次输入显示两次,第三次输入显示3次。并显示Child exited
3次。
您可以尝试以下方法。
- 在创建子进程时添加事件监听器
- 发送响应后删除侦听器
- 使用
once
为这些事件设置一次性侦听器
希望对您有所帮助
我有这个节点js代码
var bat = null;
app.post("/api/run", function(req,res) {
if(!bat) {
bat = spawn('cmd.exe', ['/c App.exe']);
}
if(req.body.success) {
bat.kill();
}
bat.stdin.write(req.body.input+'\n');
bat.stdout.on('data', function (data) {
console.log(data.toString());
res.end(JSON.stringify({data: data.toString()}));
});
bat.stderr.on('data', function (data) {
console.log(data.toString());
});
bat.on('exit', function (code) {
bat = null;
console.log('Child exited with code ' + code);
});
});
这段代码假设只创建一个将 运行 exe 文件的子进程。但是在 3 ajax 请求之后,当子进程被杀死时,控制台上会输出:
Input NO: 1 You entered: input 1
Input NO: 2 You entered: input 2
Input NO: 2 You entered: input 2
Input NO: 3 You entered: input 3
Input NO: 3 You entered: input 3
Input NO: 3 You entered: input 3
Child exited with code 1
Child exited with code 1
Child exited with code 1
虽然它应该记录每个输入一次并且应该只有一个子进程。这段代码有什么问题。
任何帮助将不胜感激。谢谢
你只是在实例化一个进程,但你不断地在每个请求上连接新的事件处理程序,这就是你得到重复输出的原因(3 个请求 = 消息的 3 倍)。
将您的 .on
调用移到 if (!bat)
语句中
if (!bat) {
bat = spawn('cmd.exe', ['/c App.exe']);
bat.stdout.on('data', function (data) {
console.log(data.toString());
res.end(JSON.stringify({data: data.toString()}));
});
bat.stderr.on('data', function (data) {
console.log(data.toString());
});
bat.on('exit', function (code) {
bat = null;
console.log('Child exited with code ' + code);
});
}
bat.stdin.write(req.body.input+'\n');
实际上只有一个子进程,但是每次请求都会为子进程添加一个exit
事件监听器。所以第二次输入显示两次,第三次输入显示3次。并显示Child exited
3次。
您可以尝试以下方法。
- 在创建子进程时添加事件监听器
- 发送响应后删除侦听器
- 使用
once
为这些事件设置一次性侦听器
希望对您有所帮助