node.js - Как порождать дочерний процесс, не блокируя стандартный родительский процесс? - PullRequest
0 голосов
/ 07 ноября 2018

Я создаю интерактивный CLI в узле (и blessed.js), который порождает дочерние процессы каждые пару секунд для запуска некоторых скриптов Python. Эти сценарии изменяют набор файлов JSON, из которых извлекается CLI.

Проблема заключается в том, что CLI должен иметь возможность принимать входные данные от пользователя в любое время, и когда эти дочерние процессы порождаются, stdin CLI / родительского процесса кажется заблокированным и выглядит как Python Сценарии выполняются на переднем плане. Вот код, который я использую для запуска скриптов Python:

const { spawn } = require("child_process");

function execPythonScript(args) {
    return spawn("python3", args, { stdio: "ignore" });
}

execPythonScript(["path_to_script.py"]);

Я также пытался запустить скрипт как фоновый процесс, т.е. execPythonScript(["path_to_script.py", "&"]), но безрезультатно. Есть идеи?

Заранее спасибо!

UPDATE:

Я начинаю подозревать, что это проблема с blessed, а не child-process, так как я исчерпал все соответствующие методы (и их аргументы) для порождения неблокирующих фоновых процессов, и проблема все еще сохраняется.

Каждый экземпляр blessed использует process.stdin для ввода по умолчанию, но я полагал, что поток stdin может быть использован дочерними процессами, даже несмотря на то, что я порождаю их с stdio, установленным в " игнорировать». Поэтому я попытался использовать ttys и создать экземпляр blessed.screen для чтения с активного терминала (/dev/tty) вместо /dev/stdin:

const ttys = require("ttys");

screen = blessed.screen({
    input: ttys.stdin, // Instead of process.stdin
    smartCSR: true
});

Но это все еще блокирует ...

1 Ответ

0 голосов
/ 07 ноября 2018

Вам также необходимо отключить процесс:

spawn("python3", args, { stdio: "ignore", detached: true })

Этот является полезным праймером.

...