Node.js child_process-Modul

Java FileNode.js integrierte Module


Node.js ist eine Single-Threaded-JavaScript-Laufzeitumgebung, aber manchmal müssen wir Systembefehle ausführen oder andere Programme starten. In solchen Fällen müssen wir daschild_processModul.

child_processDas Modul ermöglicht Node.js-Anwendungen, Kindprozesse zu erstellen, die Systembefehle ausführen, andere Skripte oder Programme ausführen und mit dem Elternprozess kommunizieren können.


Warum brauchen wir child_process?

  1. Systembefehle ausführen: Zum Beispiel das Ausführen vonls、gitund anderen Kommandozeilen-Tools
  2. CPU-intensive Aufgaben ausführen: Blockieren des Node.js-Hauptthreads vermeiden
  3. Mit Programmen interagieren, die in anderen Sprachen geschrieben sind: Zum Beispiel Aufrufen von Python- oder C++-Programmen
  4. Anwendungsleistung verbessern: Multi-Core-CPUs durch Multi-Prozess voll ausnutzen

Vier Methoden zum Erstellen von Kindprozessen

1. exec() - Einfache Befehle ausführen

exec()Die Methode wird verwendet, um einfache Shell-Befehle auszuführen und die Ausgabeergebnisse zu puffern.

Beispiel

const { exec } = require('child_process');

exec('ls -l', (error, stdout, stderr) => {
  if (error) {
    console.error(`Ausführungsfehler: ${error}`);
    return;
  }
  console.log(`Standardausgabe:\n${stdout}`);
  if (stderr) {
    console.error(`Standardfehlerausgabe:\n${stderr}`);
  }
});

Funktionen:

  • Geeignet zum Ausführen einfacher Befehle
  • Gibt die vollständige gepufferte Ausgabe zurück
  • Hat ein maximales Pufferlimit (Standard: 200KB)

2. execFile() - Ausführbare Dateien ausführen

execFile()Ähnlich wieexec(), sondern führt die Datei direkt aus, anstatt die Shell zu verwenden.

Beispiel

const { execFile } = require('child_process');

execFile('node', ['--version'], (error, stdout, stderr) => {
  if (error) {
    throw error;
  }
  console.log(stdout);
});

Funktionen:

  • Vergleichenexec()Sicherer (läuft nicht über die Shell)
  • Höhere Ausführungseffizienz
  • Shell-Funktionen können nicht genutzt werden (wie Pipes, Wildcards usw.)

3. spawn() - Stream-Verarbeitung von Kindprozessen

spawn()Die Methode verwendet eine Streaming-Schnittstelle, um die Ein-/Ausgabe von Kindprozessen zu verarbeiten.

Beispiel

const { spawn } = require('child_process');

const ls = spawn('ls', ['-lh', '/usr']);

ls.stdout.on('data', (data) => {
  console.log(`Standardausgabe: ${data}`);
});

ls.stderr.on('data', (data) => {
  console.error(`Standardfehlerausgabe: ${data}`);
});

ls.on('close', (code) => {
  console.log(`Exit-Code des Kindprozesses: ${code}`);
});

Funktionen:

  • Geeignet für die Verarbeitung großer Ausgabemengen
  • Streaming-Verarbeitung, hohe Speichereffizienz
  • Kann Ausgaben in Echtzeit verarbeiten

4. fork() - Node.js-Kindprozesse erstellen

fork()Jaspawn()Ein Sonderfall von , der speziell zum Erstellen neuer Node.js-Prozesse verwendet wird.

Beispiel

const { fork } = require('child_process');

const child = fork('child.js');

child.on('message', (msg) => {
  console.log('Message from child process:', msg);
});

child.send({ hello: 'world' });

Funktionen:

  • Erstellt eine neue Node.js-Instanz
  • Eingebauter IPC-Kanal (Interprozesskommunikation)
  • Geeignet für CPU-intensive Aufgaben

Interprozesskommunikation (IPC)

Eltern- und Kindprozesse können kommunizieren übersend()undmessageEreignisse.

Elternprozess (parent.js):

Beispiel

const { fork } = require('child_process');
const child = fork('child.js');

child.on('message', (msg) => {
  console.log('Elternprozess empfangen:', msg);
});

child.send({ parent: 'Hallo vom Elternprozess' });

Kindprozess (child.js):

Beispiel

process.on('message', (msg) => {
  console.log('Kindprozess empfangen:', msg);
  process.send({ child: 'Hallo vom Kindprozess' });
});

Fehlerbehandlung

Die ordnungsgemäße Behandlung von Fehlern in Kindprozessen ist sehr wichtig:

Beispiel

const { spawn } = require('child_process');
const child = spawn('some_command');

child.on('error', (err) => {
  console.error('Fehler beim Starten des Kindprozesses:', err);
});

child.stderr.on('data', (data) => {
  console.error(`Fehler im Kindprozess: ${data}`);
});

child.on('exit', (code, signal) => {
  if (code) console.log(`Exit-Code des Kindprozesses: ${code}`);
  if (signal) console.log(`Kindprozess durch Signal beendet: ${signal}`);
});

Best Practices

  1. Sicherheit: Vermeiden Sie, Benutzereingaben direkt an Kindprozesse weiterzugeben
  2. Ressourcenverwaltung: Abgeschlossene Kindprozesse zeitnah aufräumen
  3. Fehlerbehandlung: Behandeln Sie immer error- und exit-Ereignisse
  4. Leistungsüberlegungen: Bei häufig erstellten Kindprozessen die Verwendung eines Prozesspools in Betracht ziehen
  5. Plattformübergreifende Kompatibilität: Achten Sie auf Befehlsunterschiede zwischen verschiedenen Betriebssystemen

Zusammenfassung

child_processDas Modul ist das Kernmodul in Node.js für die Handhabung von Kindprozessen und bietet vier Methoden zum Erstellen von Kindprozessen:

  1. exec()- Geeignet für einfache Befehle
  2. execFile()- Geeignet zum Ausführen ausführbarer Dateien
  3. spawn()- Geeignet für die Streaming-Verarbeitung
  4. fork()- Geeignet zum Erstellen von Node.js-Kindprozessen

Wählen Sie die geeignete Methode basierend auf den spezifischen Anforderungen, und achten Sie auf Fehlerbehandlung und Ressourcenverwaltung, um die Multi-Prozess-Fähigkeiten von Node.js voll auszuschöpfen.

Java FileNode.js integrierte Module

Weitere Erweiterungen