Java ProcessBuilder (). Start () и NodeJS require ('child_process'). Spawn () - PullRequest
0 голосов
/ 10 января 2019

У нас есть устаревшее приложение, написанное на NodeJS, которое вызывает приложение C ++ с методом require('child_process').spawn(). Время работы приложения C ++ составляет около 5 секунд.

Затем я преобразовываю приложение NodeJS в Java и использую ProcessBuilder().start() для вызова того же приложения C ++. Теперь для завершения приложения требуется около 30 секунд.

Знаете ли вы, в чем может быть причина, или это нормальное поведение? Приложение C ++ создает несколько файлов (около 20). В чем может быть причина и как я могу улучшить это? Спасибо

1 Ответ

0 голосов
/ 10 января 2019

require('child_process').spawn() не является синхронизирующим вызовом. Этот метод порождает дочерний процесс асинхронно, не блокируя цикл событий Node.js.

Если вы попробуете require('child_process').spawnSync(), он будет ждать процесса C ++.

Так что я думаю, что в Java вам нужно запустить этот процесс с новым потоком. В документации написано

Обратите внимание, что этот класс не синхронизирован. Если несколько потоков обращаются к Экземпляр ProcessBuilder одновременно и хотя бы один из потоков изменяет один из атрибутов структурно, он должен быть синхронизирован внешне.

DOC

Если вы хотите запустить его асинхронно, возможно, вам нужно создать новый экземпляр вместо использования одного экземпляра.

Process p = new ProcessBuilder("myCommand", "myArg").start();
...