L'I/O bloccante ferma il thread chiamante finché l'operazione non termina; l'I/O non bloccante ritorna immediatamente e lascia che il thread faccia altro lavoro mentre l'operazione si completa. Sync vs async descrive la stessa idea a livello di API.
L'I/O bloccante ferma il thread chiamante finché l'operazione non termina; l'I/O non bloccante ritorna immediatamente e lascia che il thread faccia altro lavoro mentre l'operazione si completa. Sync vs async descrive la stessa idea a livello di API.
read() finché non arrivano i dati. Semplice, ma il thread resta inattivo per tutto il tempo — per servire N client lenti servono N thread.Bloccante: ──[ attesa del disco ]── (thread bloccato, non fa nulla)
Non bloccante: ──▶ ritorna subito; l'event loop viene notificato quando è pronto
// Bloccante: nient'altro gira finché il file non è letto
const data = fs.readFileSync('big.txt');
// Non bloccante: il thread prosegue; la callback scatta più tardi
fs.readFile('big.txt', (err, data) => { /* gestisci dopo */ });
// oppure async/await sopra primitive non bloccanti
const data2 = await fs.promises.readFile('big.txt');
Questo è il cuore dei server scalabili. Node.js e nginx gestiscono un numero enorme di connessioni su pochi thread proprio perché l'I/O è non bloccante — l'attesa non impegna un thread. Usa le chiamate bloccanti per semplicità negli script; usa quelle non bloccanti per servizi di rete ad alta concorrenza, e non bloccare mai l'event loop con lavoro CPU-intensive.
Una raccolta di domande di colloquio IT con risposte dettagliate — da Junior a Senior.
Dona