Hàng đợi tác vụ và vòng lặp sự kiện javascript

Nội dung bài viết

Task queue and event loop - Khi JavaScript đang chạy, ngoài một luồng chính đang chạy, engine cũng cung cấp một hàng đợi tác vụ, chứa các tác vụ không đồng bộ khác nhau cần được xử lý bởi chương trình hiện tại. Trước khi đi đến bài viết này, điều kiện tiên quyết là bạn phải hiểu về javascript mô hình đơn luồng ở bài viết trước ngoài ra trong đó có đề cập tới vấn đề các tác vụ đồng bộ và không đồng bộ. Nên cẩn thận và xem trước. 


Và quan trọng hơn nữa vì đây là bài viết tổng hợp khái niệm về có nhiều thuật ngữ máy tính không thể giải thích bằng từ địa phương, nên các bạn đừng thắc mắc, vì tôi sẽ trỏ link để giải thích. Ví dụ như: engine javascript...


Serires lịch sử javascript


Phần 1: Vì sao javascript là mô hình đơn luồng

Phần 2: Hàng đợi tác vụ và sự kiên vòng lặp trong javascript


Hàng đợi tác vụ và vòng lặp sự kiện


Trên thực tế, có nhiều hàng đợi nhiệm vụ tùy thuộc vào loại tác vụ không đồng bộ. Để dễ hiểu, người ta giả định rằng chỉ có một hàng đợi. Khi JavaScript đang chạy, ngoài một luồng chính đang chạy, engine cũng cung cấp một hàng đợi tác vụ, chứa các tác vụ không đồng bộ khác nhau cần được xử lý bởi chương trình hiện tại. Đầu tiên, luồng chính sẽ thực hiện tất cả các tác vụ đồng bộ hóa. 


Khi tất cả các tác vụ đồng bộ được thực thi, chúng sẽ xem xét các tác vụ không đồng bộ trong hàng đợi tác vụ. Nếu các điều kiện được đáp ứng, tác vụ không đồng bộ sẽ vào lại luồng chính để bắt đầu thực thi, và sau đó nó sẽ trở thành tác vụ đồng bộ. Sau khi thực thi hoàn tất, tác vụ không đồng bộ tiếp theo đi vào luồng chính để bắt đầu thực thi. Khi hàng đợi tác vụ được làm trống, chương trình sẽ kết thúc quá trình thực thi. 


Các tác vụ không đồng bộ thường được viết dưới dạng các hàm gọi lại (callback). Khi tác vụ không đồng bộ vào lại luồng chính, hàm callback tương ứng sẽ được thực thi. Nếu một tác vụ không đồng bộ không có hàm gọi lại, nó sẽ không vào hàng đợi tác vụ, tức là nó sẽ không vào lại luồng chính, vì hàm callback không được sử dụng để chỉ định thao tác tiếp theo. 


Dừng ở đây một chút, vì sẽ có câu hỏi như sau: "Làm cách nào để công cụ JavaScript biết được liệu một tác vụ không đồng bộ có kết quả hay không và liệu nó có thể vào chuỗi chính hay không?" 


Câu trả lời là engine liên tục kiểm tra, lặp đi lặp lại, miễn là các tác vụ đồng bộ được thực thi, engine sẽ kiểm tra xem các tác vụ không đồng bộ bị treo có thể vào luồng chính hay không. Cơ chế kiểm tra vòng lặp kiểu này được gọi là vòng lặp sự kiện (Event Loop). Định nghĩa của Wikipedia là: "Vòng lặp sự kiện là một cấu trúc chương trình để chờ và gửi thông điệp và sự kiện (một cấu trúc lập trình chờ và gửi các sự kiện hoặc thông điệp trong một chương trình)". 


Trước đây tôi có giải thích về "Event Loop chính là một hoạt động của một nhà hàng" và ở đó bạn có thể tìm thấy vì sao nó lại quan trọng trong lập trình.


Ref: 

https://en.wikipedia.org/wiki/Event_loop 

https://en.wikipedia.org/wiki/JavaScript_engine 

https://anonystick.com/blog-developer/javascript-su-dung-don-luong-ly-do-tai-sao-2021040171820607

Có thể bạn đã bị missing