Sobes.tech
Middle+

Come viene implementato il multithreading in Node.js?

sobes.tech AI

Risposta dell'AI

Node.js è intrinsecamente single-thread per eseguire il codice JavaScript dell'utente. Il multitasking si ottiene tramite input/output non bloccante e l'Event Loop. Il multithreading per l'esecuzione di compiti pesanti viene implementato con il modulo worker_threads.

Event Loop:

  • Meccanismo principale per operazioni asincrone.
  • Ciclo a thread singolo che gestisce callback relativi a operazioni I/O, timer e altri eventi asincroni.

Worker Threads:

  • Permettono di eseguire in parallelo compiti pesanti CPU-bound.
  • Ogni worker avvia il proprio motore V8 JavaScript in un thread separato.
  • La comunicazione tra thread principale e worker avviene tramite l'invio di messaggi (postMessage, receiveMessage).

Confronto:

Meccanismo Scopo Parallelismo Isolamento degli stati Uso della memoria Complessità Più adatto per
Event Loop I/O asincrono Concorrenza Stato condiviso Efficiente Bassa Task I/O-bound
Worker Threads Calcoli CPU-bound Parallelismo Isolamento completo Più elevato Medio Task CPU-bound

Esempio di utilizzo di worker_threads:

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

if (isMainThread) {
  // Questo è il thread principale
  const worker = new Worker(__filename); // Creiamo un worker usando lo stesso file

  worker.on('message', (msg) => {
    console.log(`Messaggio dal worker: ${msg}`);
  });

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

  worker.on('exit', (code) => {
    if (code !== 0)
      console.error(`Il worker si è terminato con il codice ${code}`);
  });

  worker.postMessage('Ciao, worker!'); // Invia un messaggio al worker

} else {
  // Questo è il thread del worker
  parentPort.on('message', (msg) => {
    console.log(`Messaggio dal thread principale: ${msg}`);
    parentPort.postMessage('Ciao, thread principale!'); // Risposta
  });
}

L'Event Loop è gestito a livello di Node.js e libuv, mentre worker_threads fornisce API per creare e gestire esplicitamente thread per l'esecuzione di codice JavaScript.