Я использую node.js/express.js в Windows, и у меня есть команда, которую я выполняю, когда пользователь берет изображение и загружает оттуда телефон. После загрузки я запускаю myApp.exe для обработки изображений openCV и вывожу обновленные изображения в выходной каталог, который является аргументом в приведенной ниже команде.
Я могу запустить это из своего веб-приложения с помощью child_process.exec, но производительность в 60 раз ниже, если я запускаю его из командной строки отдельно. Чтобы повысить производительность, я надеялся использовать Spawn, но я не знаю, является ли это точным предположением, пожалуйста, дайте мне знать, если это не так.
var exec = require('child_process').exec;
var child = exec('C:\\opt\\package_v030_package\\myApp.exe
--user="C:\\opt\\package_v030_package\\Phone\\'+file.filename+'"
--mv="C:\\opt\\package_v030_package\\mv\\'+req.body.detectionString+'.bmp"
--outPath="C:\\opt\\package_v030_package\\output"
--outputScaled
--outputScaledOverlaid');
child.stdout.on('data', function(data) {
console.log('stdout: ' + data);
});
child.stderr.on('data', function(data) {
console.log('stdout: ' + data);
});
child.on('close', function(code) {
console.log('closing code: ' + code);
//res.json("success")
});
Я попытался запустить его с помощью spawn, но он не выполняется со следующим: «Ошибка дочернего процесса завершена с кодом 4294967295». Код ниже:
var spawn = require('child_process').spawn;
var cmd = spawn('cmd', ['/s',
'/c',
'C:\\opt\\package_v030_package\\myApp.exe',
'--user="C:\\opt\\package_v030_package\\Phone\\'+file.filename+'"',
'--mv="C:\\opt\\package_v030_package\\mv\\'+req.body.detectionString+'.bmp"',
'--outPath="C:\\opt\\package_v030_package\\output"',
'--outputScaled',
'--outputScaledOverlaid'
]);
cmd.stdout.on('data', (data) => {
console.log(`stdout: ${data}`);
});
cmd.stderr.on('data', (data) => {
console.log(`stderr: ${data}`);
});
cmd.on('close', (code) => {
console.log(`child process exited with code ${code}`);
});
Кажется, я могу выполнить только myApp.exe из спавна, потому что, когда я добавляю любой из своих аргументов, он терпит неудачу. Даже когда я жестко кодирую переменные, которые я ввожу. Есть ли проблема с моими аргументами или я неправильно создаю myApp.exe?
Обновление 1
Я поместил команду в .bat и смог выполнить ее из node.js, используя spawn. Это не увеличивает производительность, что наводит меня на мысль, что снижение производительности является ограничением node.js на платформе Windows.
Кроме того, я выполнил несколько тестов с помощью postman, чтобы увидеть, смогу ли я оптимизировать вызов без каких-либо других действий, но мне это не удалось. Я оставлю этот вопрос открытым на случай, если он изменится, и node.js сможет лучше справляться с производительностью дочернего процесса с интенсивным использованием ЦП.
Обновление 2 и ответ
Я смог исправить это, поместив команду, которую мы запускаем в командной строке, в класс Java, принимающий в качестве параметра строку обнаружения. Затем с узла я использую spawn, чтобы запустить файл .jar. Это привело к значительному увеличению скорости и работе, как если бы я сам запускал ее в командной строке.