Sobes.tech
Middle+

Hoe wordt multithreading geïmplementeerd in Node.js?

sobes.tech AI

Antwoord van AI

Node.js is van nature single-threaded om gebruikers JavaScript-code uit te voeren. Multitasking wordt bereikt door niet-blokkerende invoer/uitvoer en de Event Loop. Multithreading voor het uitvoeren van zware taken wordt geïmplementeerd met de module worker_threads.

Event Loop:

  • Het belangrijkste mechanisme voor asynchrone operaties.
  • Een single-threaded cycle die callbacks verwerkt die gerelateerd zijn aan I/O-operaties, timers en andere asynchrone gebeurtenissen.

Worker Threads:

  • Stellen in staat om zware CPU-bound taken parallel uit te voeren.
  • Elke worker start zijn eigen V8 JavaScript-engine in een aparte thread.
  • Communicatie tussen de hoofdthread en workers gebeurt via berichtgeving (postMessage, receiveMessage).

Vergelijking:

Mechanisme Doel Parallelisme Isolatie van staten Geheugengebruik Complexiteit Beter geschikt voor
Event Loop Asynchrone I/O Concurrerend Gedeelde staat Efficiënt Laag I/O-gebonden taken
Worker Threads CPU-bound berekeningen Parallelisme Geïsoleerd Hoger Gemiddeld CPU-bound taken

Voorbeeld van gebruik van worker_threads:

// main.js
const { Worker, isMainThread, parentPort } = require('worker_threads');

if (isMainThread) {
  // Dit is de hoofdthread
  const worker = new Worker(__filename); // Maak een worker met hetzelfde bestand

  worker.on('message', (msg) => {
    console.log(`Bericht van de worker: ${msg}`);
  });

  worker.on('error', (err) => {
    console.error(err);
  });

  worker.on('exit', (code) => {
    if (code !== 0)
      console.error(`De worker eindigde met code ${code}`);
  });

  worker.postMessage('Hallo, worker!'); // Stuur bericht naar de worker

} else {
  // Dit is de worker thread
  parentPort.on('message', (msg) => {
    console.log(`Bericht van de hoofdthread: ${msg}`);
    parentPort.postMessage('Hallo, hoofdthread!'); // Stuur antwoord
  });
}

De Event Loop wordt beheerd op het niveau van Node.js en libuv, terwijl worker_threads API's biedt voor het expliciet maken en beheren van threads voor het uitvoeren van JavaScript-code.