Giới thiệu 📜
Nhiều tài liệu hiện có về Event Loop trên Internet nhưng vẫn ít thông tin dễ hiểu. Bài viết này được tổng hợp từ bài viết của tác giả VISHWAS GOPINATH trên builder.io, nhằm giúp bạn đọc nắm vững kiến thức về Event Loop trong NodeJS. Mình còn cùng tạo một số GIF mô phỏng để bạn dễ hình dung hơn 🌟.
Thông tin package 📦️
Bạn có thể tải về các ví dụ tại đây.
Lý thuyết cơ bản 📃
Mã Javascript đồng bộ được viết bởi người dùng có ưu tiên cao hơn mã không đồng bộ mà runtime muốn thực thi. Chỉ sau khi call stack trống, event loop mới bắt đầu hoạt động.
Điều này có nghĩa rằng nếu mã hiện tại đang chạy ở chế độ đồng bộ, thì các callback của code không đồng bộ sẽ không được gọi cho đến khi mọi mã đồng bộ đã hoàn thành.
Event loop trong NodeJS được chia thành 4 giai đoạn chính:
- Timer: Các hàm liên quan đến thời gian như setTimeout, setInterval.
- I/O Polling: Xử lý các tác vụ liên quan đến I/O.
- Check: Gọi các callback trong setImmediate.
- Close: Xử lý các callback cho các handler đã đóng.
Ngoài ra, giữa các giai đoạn này sẽ gọi đến microtask queue, bao gồm 2 phần:
- nextTick: Thực thi các callback trong process.nextTick.
- Promise: Gọi callback khi promise hoàn thành.
Microtask Queue 🔬
nextTick Queue ✔️
Các callback của process.nextTick được đưa vào nextTick queue.
Các callback trong nextTick queue sẽ được thực thi cho đến khi không còn callback nào.
Promise Queue 🤝
Callback khi Promise resolve sẽ được thêm vào Promise queue. Các callback trong Promise queue cũng được xử lý ngay trong giai đoạn microtask.
Timer Queue 🕰️
Callbacks từ setTimeout và setInterval sẽ vào Timer queue. Chúng sẽ chỉ được đưa vào khi hết thời gian quy định.
I/O Queue 🟰
Hầu hết các hàm không đồng bộ trong các module của NodeJS sẽ đưa callback của nó vào I/O queue. Nhưng hãy nhớ rằng thứ tự thực thi giữa Timer và I/O queue không được đảm bảo.
I/O Polling
Giai đoạn này kiểm tra xem các tác vụ không đồng bộ đã hoàn thành chưa và đưa callback vào I/O queue khi hoàn thành.
Check Queue ✅️
Xử lý các callback từ setImmediate, tuy nhiên các callback trong microtask queue sẽ được thực hiện trước.
Close Queue 📴
Queue này xử lý các callback liên quan đến sự kiện đóng của các tác vụ không đồng bộ.
Kết luận 📝
Chúng ta đã khám phá cơ bản về Event Loop trong NodeJS. Ở phần sau, hãy cùng nhau tìm hiểu thêm về ví dụ thực tế để thấy được giá trị mà nó mang lại.
Tài liệu tham khảo 🔍
- Node.js - The Node.js Event Loop. Available at: Node.js (Truy cập: 30 tháng 5 năm 2024).
- VISHWAS GOPINATH (2023). Visualizing nexttick and promise queues in node.js event loop. Available at: Builder.io (Truy cập: 30 tháng 5 năm 2024).
source: viblo