2016-04-25 13 views
3

Ich habe eine node.js-Anwendung, die eine Datei über eine Webanforderung empfängt und dann einen Konvertierungsprozess für diese Datei anwendet. Da die Aufgabe lange läuft, muss sie separat zum Hauptthread ausgeführt werden.node.js run Funktion im Kindprozess?

Im Moment habe ich gerade den notwendigen Code über einen setTimeout() Anruf angerufen. Um die Hauptanwendung vom Konvertierungsprozess zu isolieren, möchte ich sie in einen Child-Prozess verschieben, da dieser lange läuft und ich den Hauptcode von der Arbeit isolieren möchte (mache ich mir zu viele Sorgen?). Im Moment ich rufe:

const execFile = require('child_process').execFile; 
const child = execFile('node', './myModule.js', (error, stdout, stderr) => { 
    if (error) { 
    throw error; 
    } 
    console.log(stdout); 
}); 

Ist das der richtige Ansatz in node.js, oder gibt es einfach einen untergeordneten Prozess mit dem Modul beginnen und params angegeben, aber nicht angeben muß ‚Knoten‘, wie die ausführbar?

+0

Haben Sie ein besonderes Problem mit diesem Ansatz? Das ist eine von mehreren Möglichkeiten, einen neuen Prozess zu starten ('.spawn()' und '.exec()' sind ähnlich). Ich kann Ihnen sagen, dass Ihr "throw error" nichts nützliches tut, da das Einwerfen eines regulären asynchronen Callbacks nirgends nützlich sein kann, also macht es nichts anderes als 'return'. – jfriend00

+0

Ist Ihr lang andauernder Prozess CPU-gebunden oder IO-gebunden? Die Antwort auf diese Frage ist sehr wichtig, um zu bestimmen, welcher Ansatz zu verwenden ist. – JLRishe

+0

Ich hatte den obigen Code auf ein Beispiel basiert, das ich hatte. Ich hatte gehofft, dass ich nicht explizit auf den Befehl "node" verweisen muss, aber wenn das nicht als Problem angesehen wird, geht es mir gut. Wie für CPU/IO ist es ein Video-Konvertierungsprozess, also wahrscheinlich ein bisschen von beidem. Obwohl ich jetzt sehe, dass der Videokonvertierungsprozess tatsächlich einen externen Prozess (ffmpeg) unter der Haube hervorbringt, muss ich mich vielleicht nicht um Gabeln kümmern (ich hatte gedacht, dass es eine Bibliothek verwendet). –

Antwort

2

Gerade gesehen, dass node.js bietet die 'Gabel' -Funktion, zum Ausführen von Modulen, obwohl sie geschrieben werden müssen, als ob sie erwartet, Befehlszeilenargumente, Verarbeitung der Prozess.argv-Array.

Der Befehl Aufruf Wesen:

child_process.fork(modulePath[, args][, options]) 

Weitere Details here.

In meinem speziellen Fall macht das Forking wahrscheinlich keinen Sinn, da bereits eine Verzweigung durch die von mir verwendete node.js-Bibliothek besteht.

+0

Ist jede einzelne Nachricht vollständig voneinander isoliert? Wenn ich also zwei Nachrichten an einen untergeordneten Prozess-Fork sende, werden sie dann völlig unabhängig voneinander laufen? – narruc