Middle+
Wie wird Multithreading in Node.js implementiert?
sobes.tech KI
Antwort von AI
Node.js ist von Natur aus single-threaded, um benutzerdefinierten JavaScript-Code auszuführen. Multitasking wird durch nicht blockierende Ein- und Ausgabe und die Event Loop erreicht. Multithreading für die Ausführung schwerer Aufgaben wird mit dem Modul worker_threads implementiert.
Event Loop:
- Hauptmechanismus für asynchrone Operationen.
- Ein einzelner Thread-Zyklus, der Callbacks im Zusammenhang mit I/O-Operationen, Timern und anderen asynchronen Ereignissen verarbeitet.
Worker Threads:
- Ermöglichen die parallele Ausführung schwerer CPU-bound Aufgaben.
- Jeder Worker startet seine eigene V8-JavaScript-Engine in einem separaten Thread.
- Die Kommunikation zwischen dem Haupt-Thread und den Workern erfolgt durch Nachrichtenübertragung (postMessage, receiveMessage).
Vergleich:
| Mechanismus | Zweck | Parallelismus | Zustandsisolation | Speichernutzung | Komplexität | Besser geeignet für |
|---|---|---|---|---|---|---|
| Event Loop | Asynchrone I/O | Konkurrenz | Gemeinsamer Zustand | Effizient | Niedrig | I/O-gebundene Aufgaben |
| Worker Threads | CPU-intensive Berechnungen | Parallelismus | Isoliert | Höher | Mittlere | CPU-gebundene Aufgaben |
Beispiel für die Verwendung von worker_threads:
// main.js
const { Worker, isMainThread, parentPort } = require('worker_threads');
if (isMainThread) {
// Dies ist der Haupt-Thread
const worker = new Worker(__filename); // Erstellen eines Workers mit derselben Datei
worker.on('message', (msg) => {
console.log(`Nachricht vom Worker: ${msg}`);
});
worker.on('error', (err) => {
console.error(err);
});
worker.on('exit', (code) => {
if (code !== 0)
console.error(`Der Worker endete mit Code ${code}`);
});
worker.postMessage('Hallo, Worker!'); // Nachricht an den Worker senden
} else {
// Dies ist der Worker-Thread
parentPort.on('message', (msg) => {
console.log(`Nachricht vom Haupt-Thread: ${msg}`);
parentPort.postMessage('Hallo, Haupt-Thread!'); // Antwort senden
});
}
Der Event Loop wird auf Ebene von Node.js und libuv verwaltet, während worker_threads eine API bereitstellen, um explizit Threads zu erstellen und zu verwalten, um JavaScript-Code auszuführen.