Dieser Artikel führt hauptsächlich eine kurze Diskussion der Unterprozesse und Anwendungsszenarien von Node.j ein. Jetzt teile ich ihn mit Ihnen und gebe ihm eine Referenz.
Hintergrund
Da Ons (Alibaba Cloud RocketMQ-Paket) auf der Grundlage von C++ gekapselt ist, wird die Instanziierung mehrerer Produzenten und Konsumenten in einem einzigen Prozess nicht unterstützt Um dieses Problem zu lösen, wird der untergeordnete Prozess von Node.j verwendet.
Bei der Verwendung aufgetretene Fallstricke
Freigabe: Nachdem die Prozessverwaltung den Hauptprozess geschlossen hat, wird der untergeordnete Prozess zu einem Betriebssystemprozess (PID ist 1)
Mehrere Lösungen
Behandeln Sie den untergeordneten Prozess als unabhängigen laufenden Prozess, zeichnen Sie die PID auf und verwalten Sie den Prozess, um den Hauptprozess zu schließen und gleichzeitig den untergeordneten Prozess zu schließen, wenn Sie ihn veröffentlichen.
Der Hauptprozess Prozess überwacht das Shutdown-Ereignis, schließt aktiv den zu ihm gehörenden untergeordneten Prozess
Typ des untergeordneten Prozesses
spawn: Befehl ausführen
exec: Befehl ausführen (neue Shell)
execFile: Datei ausführen
fork: Datei ausführen
Allgemeine Ereignisse für untergeordnete Prozesse
Beenden
Schließen
Fehler
Meldung
Es gibt einen Unterschied zwischen Schließen und Beenden. Schließen wird ausgelöst, wenn Der Datenfluss wird geschlossen, und Exit ist ein Ereignis, das ausgelöst wird, wenn der Datenfluss geschlossen wird. Ereignis wird ausgelöst, wenn der Prozess beendet wird. Da mehrere untergeordnete Prozesse denselben Datenstrom gemeinsam nutzen können, wird das Schließereignis möglicherweise nicht unbedingt ausgelöst, wenn ein untergeordneter Prozess beendet wird, da zu diesem Zeitpunkt andere untergeordnete Prozesse den Datenstrom verwenden.
Unterprozessdatenfluss
stdin
stdout
stderr
Da der Hauptprozess der Ausgangspunkt ist, ist der Datenfluss des Unterprozesses entgegengesetzt zur herkömmlich verstandenen Datenflussrichtung stdin: write stream, stdout, stderr: Stream lesen.
spawn
spawn(command[, args][, options])
Führen Sie einen Befehl aus und geben Sie verschiedene Ausführungsergebnisse über den Datendatenstrom zurück.
Grundlegende Verwendung
const { spawn } = require('child_process'); const child = spawn('find', [ '.', '-type', 'f' ]); child.stdout.on('data', (data) => { console.log(`child stdout:\n${data}`); }); child.stderr.on('data', (data) => { console.error(`child stderr:\n${data}`); }); child.on('exit', (code, signal) => { console.log(`child process exit with: code $[code], signal: ${signal}`); });
Allgemeine Parameter
{ cwd: String, env: Object, stdio: Array | String, detached: Boolean, shell: Boolean, uid: Number, gid: Number }
Konzentrieren Sie sich auf das getrennte Attribut auf true, um den untergeordneten Prozess auf die unabhängige Ausführung vorzubereiten. Das spezifische Verhalten des untergeordneten Prozesses hängt vom Betriebssystem ab. Verschiedene Systeme verhalten sich unterschiedlich. Der untergeordnete Windows-Systemprozess verfügt über ein eigenes Konsolenfenster, und der untergeordnete POSIX-Systemprozess wird zur neuen Prozessgruppe und zum Sitzungsleiter.
Zu diesem Zeitpunkt ist der untergeordnete Prozess nicht vollständig unabhängig. Die laufenden Ergebnisse des untergeordneten Prozesses werden im vom Hauptprozess festgelegten Datenstrom angezeigt, und das Verlassen des Hauptprozesses wirkt sich auf den Betrieb aus der untergeordnete Prozess. Wenn stdio auf „ignore“ eingestellt ist und child.unref(); aufgerufen wird, beginnt der untergeordnete Prozess wirklich unabhängig zu laufen, und der Hauptprozess kann unabhängig beendet werden.
exec
exec(command[, options][, callback])
Führen Sie einen Befehl aus und geben Sie das Ergebnis über den Callback-Parameter zurück. Wenn der Befehl nicht abgeschlossen ist, wird ein Teil des Ergebnisses im Systemspeicher zwischengespeichert .
const { exec } = require('child_process'); exec('find . -type f | wc -l', (err, stdout, stderr) => { if (err) { console.error(`exec error: ${err}`); return; } console.log(`Number of files ${stdout}`); });
Das Beste aus beiden Welten – Spawn ersetzt Exec
Da das Ergebnis von Exec einmal zurückgegeben und vor der Rückkehr im Speicher zwischengespeichert wird, wird der Shell-Befehl ausgeführt, wenn der Die Ausgabe ist zu groß. Die Verwendung von exec zum Ausführen des Befehls kann unsere Arbeit nicht wie erwartet abschließen. Zu diesem Zeitpunkt können wir spawn anstelle von exec verwenden, um den Shell-Befehl auszuführen.
const { spawn } = require('child_process'); const child = spawn('find . -type f | wc -l', { stdio: 'inherit', shell: true }); child.stdout.on('data', (data) => { console.log(`child stdout:\n${data}`); }); child.stderr.on('data', (data) => { console.error(`child stderr:\n${data}`); }); child.on('exit', (code, signal) => { console.log(`child process exit with: code $[code], signal: ${signal}`); });
execFile
child_process.execFile(file[, args][, options][, callback])
Eine Datei ausführen
hat grundsätzlich die gleiche Funktion wie exec, außer dass es eine Skriptdatei mit einem angegebenen Pfad ausführt. und Es besteht darin, direkt einen neuen Prozess zu erstellen, anstatt eine Shell-Umgebung zu erstellen und dann das Skript auszuführen, was relativ leichtgewichtig und effizienter ist. In Windows-Systemen können Dateien wie .cmd und .bat jedoch nicht direkt ausgeführt werden. Sie können stattdessen spawn und exec verwenden.
Fork
child_process.fork(modulePath[, args][, options])
Eine Node.js-Datei ausführen
// parent.js const { fork } = require('child_process'); const child = fork('child.js'); child.on('message', (msg) => { console.log('Message from child', msg); }); child.send({ hello: 'world' });
// child.js process.on('message', (msg) => { console.log('Message from parent:', msg); }); let counter = 0; setInterval(() => { process.send({ counter: counter++ }); }, 3000);
Fork ist eigentlich eine spezielle Form von Spawn, die den Spawn-Node.js-Prozess behebt Und es wird ein Kommunikationskanal zwischen dem Master- und dem untergeordneten Prozess eingerichtet, sodass der Master- und der untergeordnete Prozess das Prozessmodul verwenden können, um basierend auf Ereignissen zu kommunizieren.
Subprozess-Nutzungsszenarien
Rechenintensive Systeme
Front-End-Build-Tools unter Verwendung mehrerer -Core-CPUs Paralleles Computing zur Verbesserung der Baueffizienz
Prozessmanagement-Tools, wie zum Beispiel: einige Funktionen in PM2
Das Obige ist, was ich habe Für alle zusammengestellt. Ich hoffe, dass es in Zukunft für alle hilfreich sein wird.
Verwandte Artikel:
Über die Verwendung von vue-fontawesome in vue.js
Element neuen Knoten mit JS hinzufügen
Über die tatsächliche Verwendung von log4js in Express
So referenzieren Sie das Ali-Schriftsymbol in Vue
Through Node .js verwendet den MySQL-Verbindungspool
Das obige ist der detaillierte Inhalt vonWelche Anwendungsszenarien gibt es für Unterprozesse in Node.js?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!