Event-Driven NodeJS là gì

  • Công nghệ
  • Lập Trình

Hiểu về JavaScript bất đồng bộ Event Loop

Facebook
Linkedin
Telegram

Tác giả: Giang Coffee

Event Loop là gì và hoạt động thếnào?

Trước đây thi thoảng có làm Javascript và cũng có nghe nói qua về một số khái niệm cơ bản và hay ho của Javascript như nhân V8 của Google [quá oách], Event-Driven, Non-blocking I/O, Event Loop những khái niệm giúp JS tận dụng sức mạnh của phần cứng và hàng chục lợi ích khác. Dạo gần đây có làm nhiều về JS, gặp nhiều lỗi quái đản mình mới tự đặt ra câu hỏi là rốt cục tất cả những thứ trên là cái gì?, hoạt động thế nào? và tại sao nó mang lại lợi ích?

Hôm nay qua một số google search và đặc biệt xem đượcbài thuyết trình này mình thấy Event Loop chính là thứ nguồn gốc, hay ho nhất và muốn chia sẻ, thảo luận cùng mọi người. Đấy là những gì mình hiểu ra chứ chưa chắc đã là chuẩn xác. Anh em có gì góp ý mình cực kỳ hoan nghênh và tiếp thu.

Tất cả các ngôn ngữ lập trình đều được sinh ra để làm thứ ngôn ngữ giao tiếp giữa người và máy. Dù là ngôn ngữ gì đi chăng nữa thì cuối cùng vẫn phải dịch ra mã máy, được load lên memory, chạy từng dòng lệnh, ghi các dữ liệu tạm thời ra bộ nhớ, ổ đĩa rồi giao tiếp các thiết bị ngoại vi Thế nên để cho tiện mình xin nhắc lại một số khái niệm cơ bản sau.

1. Một số khái niệm cơbản

1.1 Stack

Stack là một vùng nhớ đặc biệt trên con chip máy tính phục vụ cho quá trình thực thi các dòng lệnh mà cụ thể là các hàm. Hàm chẳng qua là một nhóm các lệnh và chương trình thì gồm một nhóm các hàm phối hợp với nhau. Mỗi khi một hàm được triệu gọi thì nó sẽ được đẩy vào một hàng đợi đặc biệt có tên là stack. Stack là một hàng đợi kiểu LIFO [Last In First Out] nghĩa là vào đầu tiên thì ra sau cùng. Một hàm chỉ được lấy ra khỏi stack khi nó hoàn thành và return.

Nếu trong một hàm [Foo] có triệu gọi một hàm khác [Bar] thì trạng thái hiện tại của hàm Foo được cất giữ trong stack và hàm Bar sẽ được chèn vào stack. Vì đây là hàng đợi LIFO nên Bar sẽ được xử lý trước Foo. Khi Bar xong và return thì mới đến lượt Foo được xử lý. Khi Foo được xử lý xong và return thì Stack rỗng và sẽ đợi các hàm tiếp theo được đẩy vào.

Stack -------------------- | | -------------------- | Bar | { const delay = Date.now[] - timeoutScheduled; console.log[`${delay}ms have passed since I was scheduled`]; }, 100]; // đọc file xong sẽ tiếp tục chờ thêm 10ms someAsyncOperation[function readFileAsync[] => { const startCallback = Date.now[]; // chờ 10ms while [Date.now[] - startCallback < 10] { // do nothing } }];

đầu tiên phần khai báo biến và hàm sẽ được chạy nhưng không được đẩy vào stack. TiếpsetTimeout[]sẽ được đẩy vào stack và thực hiện. Hàm này không có trong Javascript Runtime mà là hàm tiện ích của Browser, nó sẽ khởi tạo một bộ đếm và sau đúng 100ms thì nó sẽ đẩy tham số đầu tiênlogInfo[là một callback hoặc có thể gọi là một event listener cũng được] vào Event Queue. Kế đến sẽ chạy hàmsomeAsyncOperationvà đẩy vào stack, vì hàm này async và có callbackreadFileAsyncnênreadFileAsyncđược đẩy luôn vào Event Queue mà không phải chờ nhưsetTimeoutđể hứng sự kiện đọc xong file [sau 95ms].

Stack Event Queue -------------------- ------------------- | | | readFileAsync |

Chủ Đề