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 })
Это полезный учебник.