𝗨𝗻𝗱𝗲𝗿𝘀𝘁𝗮𝗻𝗱𝗶𝗻𝗴 𝘁𝗵𝗲 𝗡𝗼𝗱𝗲.𝗷𝘀 𝗘𝘃𝗲𝗻𝘁 𝗟𝗼𝗼𝗽
Event Loop không phải là một worker. Nó là một điều phối viên.
Nhiều lập trình viên thấy Event Loop rất phức tạp. Sự khó khăn thường đến từ việc trộn lẫn quá nhiều khái niệm cùng một lúc. Bạn phải theo dõi libuv, Call Stack, Promises và I/O cùng một lúc.
Đây là sự thật đơn giản: Event Loop lập lịch cho các công việc. Nó không trực tiếp thực hiện công việc đó.
JavaScript chạy trên một luồng đơn (single thread). Điều này có nghĩa là mã chạy theo một đường thẳng. Một tác vụ phải hoàn thành trước khi tác vụ tiếp theo bắt đầu. Chúng ta cần một hệ thống để quản lý các tác vụ bất đồng bộ như đọc tệp hoặc yêu cầu mạng mà không làm dừng toàn bộ chương trình.
Cách thức hoạt động:
Event Loop chuyển các callback từ các hàng đợi khác nhau vào Call Stack. Hãy coi mỗi giai đoạn (phase) như một hàng người. Event Loop là người đưa mọi người từ hàng vào trong phòng.
Các giai đoạn chính là:
- Timers: Xử lý các callback từ
setTimeoutvàsetInterval. - Pending Callbacks: Xử lý các lỗi hệ thống cụ thể như lỗi TCP.
- Idle and Prepare: Các giai đoạn nội bộ được sử dụng bởi libuv. Bạn sẽ không sử dụng những giai đoạn này.
- Poll: Giai đoạn quan trọng nhất. Nó thu thập các sự kiện I/O mới như đọc tệp hoặc yêu cầu HTTP.
- Check: Xử lý các callback của
setImmediate. - Close Callbacks: Xử lý các sự kiện đóng như đóng socket.
Một sai lầm phổ biến là nghĩ rằng Event Loop có Call Stack riêng. Thực tế không phải vậy. Runtime chỉ có một Call Stack duy nhất và một hàng đợi microtask (microtask queue).
Quy trình tuân theo luồng sau:
- Event Loop chọn một callback từ giai đoạn hiện tại.
- Nó đẩy callback đó vào Call Stack.
- Call Stack thực thi mã.
- Khi callback hoàn tất, engine sẽ xử lý hết hàng đợi microtask. Đây là nơi các Promise và
async/awaittồn tại. - Event Loop chuyển sang giai đoạn tiếp theo.
Nếu bạn sử dụng setTimeout(..., 0), nó sẽ đi vào giai đoạn Timers.
Nếu bạn sử dụng setImmediate(...), nó sẽ đi vào giai đoạn Check.
Các tác vụ nặng nề được thực hiện trong nhân hệ điều hành (OS kernel) và libuv. Event Loop chỉ đơn giản là báo cho JavaScript biết khi nào đến lúc cần phản ứng.
Source: https://dev.to/joaovictor6/event-loop-entendendo-uma-das-bases-do-node-41a