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

Я делаю интерактивный 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", "&"]), но безрезультатно. Есть идеи?

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

ОБНОВИТЬ:

Я начинаю подозревать, что это проблема с 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 ответ

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

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

Это полезный учебник.

Другие вопросы по тегам