当前,我有一个简单的bash脚本运行器模块:
"use strict";
function bashRun(commandList,stdoutCallback,completedCallback)
{
const proc=require("child_process");
const p=proc.spawn("bash");
p.stdout.on("data",function(data){
stdoutCallback(output);
});
p.on("exit",function(){
completedCallback();
});
p.stderr.on("data",function(err){
process.stderr.write("Error: "+err.toString("utf8"));
});
commandList.forEach(i=>{
p.stdin.write(i+"\n");
});
p.stdin.end();
}
module.exports.bashRun = bashRun;
即使我可以在for循环中使用它来异步运行bash脚本,但性能还是很差的(每个脚本都在运行CPU繁重的程序)。我现在需要制作一个fork
版本。但是fork只接受Nodejs模块,因此我试图使用回调参数来创建bashRun模块,但不知道如何将回调传递给派生进程。
我需要在不同的进程上同时启动20个bash脚本(异步还不够,脚本正在执行过多的CPU工作。)
通过管道传输主进程,20个分叉的模块及其自己的生成物的正确方法是什么?
(20x) (1x) (1x) (1x)
main --> fork ----> spawn ----> bash ----> 20 "programs" (CPU heavy)
print on stdout
main <-- fork <---- spawn <---- bash <---- then trigger events
|| (20x)
||
V
.on("data",function(){ /* how can program trigger this? */ })
如果不能将回调传递给派生的进程,是否可以通过上面的方法产生类似的功能,但是要使用fork + spawn从主模块生成20次,以便主模块一次获得20个回调?
有没有一种方法可以简单地使用“ spawn”,但给每个人自己的环境,同时仍然可以使用其on(“ data”,callback)函数?
在bash中使用&
(启动多个脚本)可以帮助它创建新进程(即使当它是1个“ spawn”时),可能在每个stdout处使用sed
(添加前缀-后缀)产生仅可以通过一个.on(“ data”,callback)事件进行解析的不同结果?