Как я могу передать ответные обратные вызовы child_process к основному процессу или его родительскому процессу? - PullRequest
0 голосов
/ 22 января 2019

В настоящее время у меня есть простой модуль запуска сценариев 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, производительность плохая (каждый сценарий работает с программами, загружающими процессор)).Мне нужно сделать fork версию сейчас.Но fork принимает только модули Nodejs, поэтому я пытаюсь разветвить модуль bashRun с параметрами обратного вызова, но не знаю, как передать обратные вызовы разветвленному процессу.

Мне нужно одновременно запустить 20 сценариев bash для разных процессов (асинхронности недостаточно, скрипты выполняют слишком много работы с ЦП.)

Как правильно передавать потоки основного процесса, 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 «порождение»), возможно, с sed (с добавлением префикса-суффикса) на каждом стандартном выводе для получения другого результатаt, который можно проанализировать только из одного события .on ("data", callback)?

...