![]() |
Quando si parla di JavaScript, prima o poi spuntano due concetti spesso confusi tra loro: concorrenza e parallelismo.
A volte vengono usati come sinonimi, ma in realtà descrivono due modi completamente diversi di gestire più attività.
Capire questa differenza è fondamentale per scrivere codice più efficiente, evitare blocchi inutili e scegliere l’architettura giusta per applicazioni complesse.
👉 Che cos’è davvero la concorrenza?
La concorrenza è la capacità di un sistema di gestire più compiti non nello stesso istante, ma alternandoli rapidamente in modo da mantenere fluida l’esecuzione.
Immagina una fabbrica con una sola macchina che deve lavorare su diversi pezzi. Non può lavorare su due pezzi nello stesso momento, quindi usa una strategia di alternanza:
-
lavora un po’ sul pezzo A
-
lo mette da parte
-
lavora un po’ sul pezzo B
-
lo mette da parte
-
ritorna al pezzo A
-
e così via…
La produzione avanza su più pezzi, anche se la macchina è una sola.
La simultaneità è solo apparente: il progresso avviene a “micro-turni”.
JavaScript funziona allo stesso modo:
ha un solo thread che alterna l’esecuzione dei task tramite l’event loop, gestendo in modo intelligente operazioni asincrone come timer, richieste HTTP, eventi, ecc.
👉 Che cos’è invece il parallelismo?
Il parallelismo è l’esecuzione reale e simultanea di più compiti, resa possibile da hardware con più unità di calcolo (thread, core o CPU).
Questa volta immagina una fabbrica con due o più macchine identiche, ognuna capace di lavorare in autonomia.
-
La macchina 1 lavora sul pezzo A
-
La macchina 2 lavora contemporaneamente sul pezzo B
Le due macchine operano nello stesso istante, senza alternanza.
Questo aumenta davvero la produzione totale perché le attività progrediscono in parallelo.
In JavaScript questo accade solo usando:
-
Web Workers (nel browser)
-
Worker Threads (in Node.js)
In quel caso aggiungiamo “nuove macchine” capaci di lavorare insieme al thread principale.
👉 Differenze fondamentali
-
Concorrenza → una sola macchina che alterna i pezzi.
-
Parallelismo → più macchine che lavorano contemporaneamente.
-
JavaScript di base → concorrenza tramite event loop.
-
JavaScript con Workers → parallelismo reale tramite thread separati.
🤔 Ancora qualche dubbio? Ecco una infografica chiarificatrice
![]() |
💻 Esempi in JavaScript
JavaScript non è parallelo per natura, perché il suo runtime (browser o Node.js) esegue il codice principale su un solo thread.
Però…
JavaScript può fare parallelismo delegando a Worker Threads o Web Workers, che girano su thread separati.
👉 Concorrenza in JavaScript
Perché questo è concorrenza?
Il thread principale esegue Start, poi delega il timeout all’ambiente esterno (browser o Node).
Il task asincrono viene messo in coda e ripreso in seguito, quando il thread è libero.
Nessun calcolo avviene in parallelo: il thread alterna l’esecuzione dei compiti proprio come la macchina unica della fabbrica che passa da un pezzo all’altro.
È concorrenza pura: interleaving intelligente, non simultaneità.
Approfondisci "interleaving" ⬇️
⛓️ Parallelismo reale con Web Worker (nel browser)
I Web Workers ti permettono di spostare calcoli pesanti fuori dal main thread, evitando freeze e garantendo parallelismo reale.
🧪 Esempio: un Web Worker che elimina un loop pesante dal main thread
main.js
worker.js
Perché questo è parallelismo?
Il worker esegue il ciclo pesante in un thread separato, mentre il thread principale continua a elaborare log, eventi e UI.
È come avere due macchine autonome che lavorano su pezzi diversi nello stesso momento.
Il carico si divide davvero e il tempo totale si riduce.
👯♀️ Parallelismo in Node.js con Worker Threads
main.js
heavy.js
const { parentPort } = require("node:worker_threads");
parentPort.on("message", () => {
let count = 0;
for (let i = 0; i < 1e9; i++) count += i;
parentPort.postMessage(count);
});Perché questo è parallelismo?
A differenza dell’asincronia classica, qui viene creato un vero thread del sistema operativo.
Il thread principale non alterna i compiti: lascia parte del lavoro a un’altra “macchina” che opera indipendentemente.
📌 JavaScript è concorrente, non parallelo… finché non serve
Ecco una sintesi semplice e utile:
| Concetto | Come funziona nel JS normale | Quando usarlo |
|---|---|---|
| Concorrenza | Event loop, timers, async/await, fetch |
I/O, network, UI, animazioni |
| Parallelismo | Web Workers / Worker Threads | Calcoli pesanti, CPU-bound, analisi dati |
🧭 Quando scegliere cosa?
Usa concorrenza per:
-
chiamate HTTP
-
accesso al file system (Node.js)
-
timers
-
tutto ciò che aspetta una risorsa esterna
→ Eviterai blocchi inutili.
Usa parallelismo per:
-
compressione di file
-
generazione di immagini
-
crittografia
-
grandi loop o funzioni matematiche pesanti
→ Liberi il main thread e sfrutti meglio la CPU.
👉 Conclusioni
-
La concorrenza permette a JavaScript di gestire molte operazioni alternandole rapidamente, ideale per I/O e asincronia.
-
Il parallelismo serve per sfruttare più unità di calcolo in simultanea, essenziale per compiti CPU-heavy.
-
JavaScript è nativamente concorrente, ma può diventare parallelo grazie a Web Workers e Worker Threads.
In altre parole:
✔ Concorrenza = alternanza gestionale
✔ Parallelismo = simultaneità reale
Follow me #techelopment
Official site: www.techelopment.it
facebook: Techelopment
instagram: @techelopment
X: techelopment
Bluesky: @techelopment
telegram: @techelopment_channel
whatsapp: Techelopment
youtube: @techelopment

