NodeJS захват больших данных из дочерних процессов без конвейера - PullRequest
0 голосов
/ 30 апреля 2020

В документации по дочернему процессу Node JS. Упоминается следующее:

По умолчанию каналы для stdin, stdout и stderr устанавливаются между родительским процессом Node.js и порожденным потомком. Эти каналы имеют ограниченную (и определяемую платформой c) емкость. Если дочерний процесс записывает в стандартный вывод, превышающий этот лимит без захвата выходных данных, дочерний процесс блокирует ожидание, пока буфер канала не примет больше данных.

Я пытался порождать (child_process.spawn) консольное приложение с узла. Приложение является интерактивным и выдает много данных по инициации. Очевидно, что при передаче по каналу, если процесс, выводящий данные, получает заголовок процесса, получающего ввод, ОС приостанавливает вывод процесса. Например, когда вы запускаете ps ax | cat, если процесс ps опережает процесс cat, ps приостанавливает работу до тех пор, пока cat не сможет снова принять ввод. Но в конечном итоге он должен передать все данные.

В моем случае это консольное приложение (написанное в C), кажется, полностью останавливается, когда это происходит. Я могу ошибаться, но, похоже, это так, потому что конвейерный вывод останавливается на полпути независимо от того, что я делаю. Это происходит даже тогда, когда я пью от bash, поэтому здесь нет проблем с nodejs. Может быть, это приложение не очень совместимо с тем, как работает конвейер в linux.

Я ничего не могу сделать с этим консольным приложением, но есть ли какой-то другой способ в узле получить эти блоки данных без конвейера?

Отредактировано:

Основной код

const js = spawn('julius', ['-C', 'julius.jconf', '-dnnconf', 'dnn.jconf']);

Я пробовал

js.stdout.on("data", (data) => { console.log(`stdout: ${js.stdout}`); });

и

js.stdout.pipe(process.stdout);

чтобы захватить вывод. Результат тот же, вывод обрезается.

...