Node.js child_process-Modul
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?
- Systembefehle ausführen: Zum Beispiel das Ausführen von
ls、gitund anderen Kommandozeilen-Tools - CPU-intensive Aufgaben ausführen: Blockieren des Node.js-Hauptthreads vermeiden
- Mit Programmen interagieren, die in anderen Sprachen geschrieben sind: Zum Beispiel Aufrufen von Python- oder C++-Programmen
- 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
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
execFile('node', ['--version'], (error, stdout, stderr) => {
if (error) {
throw error;
}
console.log(stdout);
});
Funktionen:
- Vergleichen
exec()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 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 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 child = fork('child.js');
child.on('message', (msg) => {
console.log('Elternprozess empfangen:', msg);
});
child.send({ parent: 'Hallo vom Elternprozess' });
Kindprozess (child.js):
Beispiel
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 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
- Sicherheit: Vermeiden Sie, Benutzereingaben direkt an Kindprozesse weiterzugeben
- Ressourcenverwaltung: Abgeschlossene Kindprozesse zeitnah aufräumen
- Fehlerbehandlung: Behandeln Sie immer error- und exit-Ereignisse
- Leistungsüberlegungen: Bei häufig erstellten Kindprozessen die Verwendung eines Prozesspools in Betracht ziehen
- 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:
exec()- Geeignet für einfache BefehleexecFile()- Geeignet zum Ausführen ausführbarer Dateienspawn()- Geeignet für die Streaming-Verarbeitungfork()- 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.
Weitere Erweiterungen
Node.js integrierte Module