Heim >Web-Frontend >js-Tutorial >Welche Anwendungsszenarien gibt es für Unterprozesse in Node.js?

Welche Anwendungsszenarien gibt es für Unterprozesse in Node.js?

亚连
亚连Original
2018-06-09 16:26:311420Durchsuche

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

  1. spawn: Befehl ausführen

  2. exec: Befehl ausführen (neue Shell)

  3. execFile: Datei ausführen

  4. fork: Datei ausführen

Allgemeine Ereignisse für untergeordnete Prozesse

  1. Beenden

  2. Schließen

  3. Fehler

  4. 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

  1. stdin

  2. stdout

  3. 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

  1. Rechenintensive Systeme

  2. Front-End-Build-Tools unter Verwendung mehrerer -Core-CPUs Paralleles Computing zur Verbesserung der Baueffizienz

  3. 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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn