2016-07-11 5 views
1

spawnen Ich benutze node.js/express.js auf Windows und ich habe einen Befehl, den ich ausführen, wenn ein Benutzer ein Bild nimmt und von dort Telefon hochlädt. Sobald es hochgeladen ist, führe ich myApp.exe aus, um einige openCV-Bildverarbeitungen durchzuführen, und ich gebe die aktualisierten Bilder in ein Ausgabeverzeichnis aus, das ein Argument im folgenden Befehl ist.Konnte keine benutzerdefinierte EXE von express.js unter Windows

Ich bin in der Lage, dies aus meiner Webanwendung mit child_process.exec, aber die Leistung ist 60x langsamer, wenn ich es an der Befehlszeile selbst ausführen. Um die Leistung zu erhöhen, hatte ich gehofft, Spawn zu verwenden, aber ich weiß nicht, ob das eine genaue Annahme ist, lass es mich wissen, wenn es nicht ist.

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") 
    }); 

Ich habe versucht, es weg zu treten Laich mit, aber es schlägt mit dem folgenden auszuführen: „Fehler Kindprozess mit Code 4294967295 verlassen“. Der Code ist unten:

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}`); 
    }); 

Es scheint, ich bin in der Lage nur MyApp.exe von Laich auszuführen, weil, wenn ich alle meine Argumente hinzufügen es funktioniert nicht. Selbst wenn ich die Variablen, die ich injiziere, hart codiere. Gibt es ein Problem mit meinen Argumenten oder spawne ich myApp.exe falsch?

Update 1

legte ich den Befehl in einer .bat und konnte es von node.js Laich mit auszuführen. Es erhöht nicht die Leistung, was zu der Annahme führt, dass der Leistungsabfall eine Einschränkung von node.js auf der Windows-Plattform darstellt.

Darüber hinaus habe ich ein paar Tests mit Postman durchgeführt, um zu sehen, ob ich den Anruf optimieren konnte, ohne dass etwas anderes passierte, aber ich war nicht erfolgreich. Ich werde diese Frage offen lassen, falls sich dies ändert, und node.js ist in der Lage, die Leistung eines CPU intensiven Kindprozesses besser zu handhaben.

Update 2 & Antwort

ich dieses Problem beheben konnte, indem Sie den Befehl platzieren, die wir in der Befehlszeile in eine Java-Klasse sich in der detectionString als Parameter ausgeführt werden. Dann benutze ich vom Knoten aus spawn, um die .jar-Datei zu starten. Dies führte dazu, dass die Geschwindigkeit deutlich anstieg und lief, als würde ich sie selbst an der Befehlszeile ausführen.

Antwort

0

Ich konnte dies beheben, indem Sie den Befehl, den wir in der Befehlszeile ausführen, in eine Java-Klasse platzieren, die den detectionString als Parameter verwendet. Dann benutze ich vom Knoten aus spawn, um die .jar-Datei zu starten. Dies führte dazu, dass die Geschwindigkeit deutlich anstieg und lief, als würde ich sie selbst an der Befehlszeile ausführen.

Verwandte Themen