Blokujące I/O zatrzymuje wątek wywołujący, dopóki operacja się nie zakończy; nieblokujące I/O wraca natychmiast i pozwala wątkowi wykonywać inną pracę, podczas gdy operacja się kończy. Sync kontra async opisuje tę samą ideę na poziomie API.
Blokujące I/O zatrzymuje wątek wywołujący, dopóki operacja się nie zakończy; nieblokujące I/O wraca natychmiast i pozwala wątkowi wykonywać inną pracę, podczas gdy operacja się kończy. Sync kontra async opisuje tę samą ideę na poziomie API.
read(), dopóki nie nadejdą dane. Proste, ale wątek jest bezczynny przez cały ten czas — aby obsłużyć N wolnych klientów, potrzebujesz N wątków.Blocking: ──[ wait for disk ]── (thread stuck, does nothing)
Non-blocking: ──▶ returns now; event loop notified when ready
// Blocking: nothing else runs until the file is read
const data = fs.readFileSync('big.txt');
// Non-blocking: thread keeps going; callback fires later
fs.readFile('big.txt', (err, data) => { /* handle later */ });
// or async/await on top of non-blocking primitives
const data2 = await fs.promises.readFile('big.txt');
To sedno skalowalnych serwerów. Node.js i nginx obsługują ogromną liczbę połączeń na niewielu wątkach właśnie dlatego, że I/O jest nieblokujące — oczekiwanie nie wiąże wątku. Używaj wywołań blokujących dla prostoty w skryptach; używaj nieblokujących dla usług sieciowych o wysokiej współbieżności i nigdy nie blokuj pętli zdarzeń pracą obciążającą CPU.
Biblioteka pytań rekrutacyjnych IT ze szczegółowymi odpowiedziami — od Juniora do Seniora.
Wesprzyj