Blocking I/O dừng thread gọi cho tới khi thao tác xong; non-blocking I/O trả về ngay và để thread làm việc khác trong khi thao tác hoàn tất. Sync vs async mô tả cùng ý tưởng ở tầng API.
Blocking I/O dừng thread gọi cho tới khi thao tác xong; non-blocking I/O trả về ngay và để thread làm việc khác trong khi thao tác hoàn tất. Sync vs async mô tả cùng ý tưởng ở tầng API.
read() cho tới khi có dữ liệu. Đơn giản, nhưng thread rảnh rỗi suốt thời gian đó — để phục vụ N client chậm bạn cần N thread.Blocking: ──[ chờ disk ]── (thread kẹt, không làm gì)
Non-blocking: ──▶ trả về ngay; event loop được báo khi sẵn sàng
// Blocking: không gì khác chạy cho tới khi đọc xong file
const data = fs.readFileSync('big.txt');
// Non-blocking: thread tiếp tục chạy; callback kích hoạt sau
fs.readFile('big.txt', (err, data) => { /* xử lý sau */ });
// hoặc async/await bên trên các primitive non-blocking
const data2 = await fs.promises.readFile('big.txt');
Đây là cốt lõi của server có khả năng mở rộng. Node.js và nginx xử lý số kết nối khổng lồ trên ít thread chính vì I/O là non-blocking — việc chờ không chiếm giữ thread. Dùng lời gọi blocking cho đơn giản trong script; dùng non-blocking cho dịch vụ mạng high-concurrency, và đừng bao giờ block event loop bằng việc CPU nặng.
Thư viện câu hỏi phỏng vấn IT với đáp án chi tiết — từ Junior đến Senior.
Ủng hộ