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.