В настоящее время у меня есть простой модуль запуска сценариев 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)?