如何将派生的child_process回调通过管道传递给主进程或其父进程?

时间:2019-01-22 02:20:28

标签: node.js bash fork spawn

当前,我有一个简单的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)事件进行解析的不同结果?

0 个答案:

没有答案