Sobes.tech
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.