Event loop
Event Loop là cơ chế trong JavaScript và Node.js giúp xử lý các tác vụ bất đồng bộ. Nó quản lý việc thực thi các đoạn mã, xử lý các sự kiện, và sắp xếp các tác vụ vào hàng đợi, đảm bảo rằng các tác vụ bất đồng bộ (như I/O hoặc timers) được thực thi sau khi các tác vụ đồng bộ hoàn tất, giúp JavaScript duy trì tính non-blocking và single-threaded.
Quy trình xử lý Event Loop:
- Nhận yêu cầu từ client:
Khi Node.js nhận được một yêu cầu từ client, nó sẽ xác định xem yêu cầu này liên quan đến các tác vụ đồng bộ (synchronous) hay bất đồng bộ (asynchronous). - Tác vụ đồng bộ:
- Nếu là tác vụ đồng bộ (như xử lý tính toán ngay lập tức), Event Loop sẽ đưa chúng vào call stack và xử lý ngay lập tức.
- Các tác vụ đồng bộ này sẽ được thực hiện theo thứ tự xuất hiện trong call stack, nghĩa là JavaScript sẽ thực hiện tuần tự từng tác vụ một và không tiếp tục các tác vụ khác cho đến khi tác vụ hiện tại hoàn tất.
- Tác vụ bất đồng bộ:
- Nếu gặp tác vụ bất đồng bộ (như truy vấn cơ sở dữ liệu, đọc file từ hệ thống, hoặc gửi HTTP request), Node.js sẽ không thực hiện ngay trong call stack.
- Những tác vụ này được chuyển đến các Web APIs hoặc Thread Pool (một nhóm các luồng chạy nền) để xử lý mà không chặn quá trình thực thi đồng bộ.
- Thread Pool:
- Thread Pool là nơi xử lý các tác vụ nặng về I/O (nhập xuất) như đọc/ghi file, xử lý mạng, hoặc thực hiện các công việc mà Node.js cần thời gian để hoàn thành.
- Khi một tác vụ bất đồng bộ được giao cho Thread Pool, nó sẽ được xử lý ở “nền” (background) mà không làm gián đoạn call stack chính.
- Sau khi tác vụ bất đồng bộ hoàn thành:
- Khi một tác vụ bất đồng bộ hoàn thành trong Thread Pool hoặc Web APIs, kết quả hoặc callback sẽ được đưa vào hàng đợi sự kiện (event queue).
- Event Loop sẽ liên tục kiểm tra call stack. Nếu call stack trống (tức là không còn tác vụ đồng bộ nào đang xử lý), Event Loop sẽ lấy kết quả từ hàng đợi sự kiện và đưa vào call stack để xử lý tiếp.
- Event Loop điều phối xử lý:
- Event Loop kiểm tra call stack để xem có tác vụ nào cần xử lý không. Nếu không, nó sẽ kiểm tra hàng đợi sự kiện và lấy các kết quả từ các tác vụ bất đồng bộ để tiếp tục xử lý.
- Nếu call stack trống, Event Loop sẽ lấy tác vụ bất đồng bộ từ hàng đợi và đưa vào call stack để xử lý, sau đó tiếp tục vòng lặp.
Tóm lại:
- Tác vụ đồng bộ được xử lý ngay lập tức trong call stack.
- Tác vụ bất đồng bộ được giao cho Thread Pool hoặc Web APIs để xử lý bên ngoài. Khi hoàn thành, kết quả của tác vụ bất đồng bộ được đẩy vào hàng đợi sự kiện.
- Event Loop sẽ kiểm tra call stack. Khi call stack trống, Event Loop sẽ lấy các tác vụ từ hàng đợi sự kiện và đưa vào call stack để tiếp tục xử lý.

Dương Trần Hà, hiện mình đang là kỹ công nghệ phần mềm và cũng là giám đốc thành lập công ty DTH Solutions. Mình có nhiều năm kinh nghiệm, kiến thức chuyên môn lập trình, nodejs, nestjs, laravel, yii2, reactjs, nextjs. Mình đã phát triển rất nhiều dự án thực tế cho doanh nghiệp, cơ quan. Mình đã đạt được một số thành công nhỏ, đồng thời mình vẫn đang tiếp tục học tập để trau dồi kiến thức mỗi ngày. Mình rất yêu thích công nghệ, đam mê chia sẻ những kiến thức, thông tin hữu ích cho mọi người.