Tính đồng thời với Javascript trong trình duyệt và Node.js (tiếp tục)
Nếu code là đồng bộ, nó được thực thi trực tiếp bằng cách đặt nó vào call stack. Nếu code là không đồng bộ, hoạt
động được bắt đầu, và thực thể khởi tạo của hoạt động đó được lưu giữ trong một hàng, cùng với một hàm callback.
Node.js runtime sẽ trước tiên thực thi tất cả các code để lại trong stack. Sau đó, event loop sẽ đi vào và check
liệu có bất cứ các tasks hoàn thành nào trong hàng. Nếu cái đó là trường hợp, hàm callback được thực thi bằng cách
đặt nó vào stack. Một hàm callback có thể sau đó lại một lần nữa hoặc thực thi code đồng bộ hoặc code không đồng
bộ. Khi chúng ta thêm một event listener – ví dụ, một onClick listener trong trình duyệt – khi người dùng click
lên phần tử liên quan, callback cũng sẽ được đặt trong task queue, cái có nghĩa nó sẽ được thực thi khi không có
thứ gì khác để lại trong stack. Tương tự, trong Node.js, chúng ta có thể thêm các listeners cho các sự kiện mạng,
và thực thi một callback khi một yêu cầu đi vào.
Tương phản với các máy chủ multi-thread, một Node.js server chấp nhận tất cả các yêu cầu trong một thread đơn,
cái chứa event loop. Các Multi-threaded servers có nhược điểm cái các threads có thể phong tỏa I/O hoàn toàn
và làm chậm server. Node.js, tuy nhiên, ủy nhiệm các hoạt động theo một cách tinh vi trên hoạt động cho các threads.
Cái này dẫn đến ít phong tỏa các hoạt động I/O hơn theo mặc định. Nhược điểm với Node.js là rằng chúng ta có
ít kiểm soát hơn lên multi-threading xảy ra như thế nào và vì vậy cần cẩn thận tránh sử dụng các hàm đồng bộ
bất cứ khi nào có thể. Mặt khác, chúng ta sẽ phong tỏa thread Node.js chính và làm chậm máy chủ của chúng ta.
Cho đơn giản hóa, chúng ta vẫn sử dụng các hàm đồng bộ trong học phần này. Đi lên, trong các học phần tiếp theo,
chúng ta sẽ tránh sử dụng những cái đó và dựa duy nhất vào các hàm không đồng bộ (khi có thể) để nhận hiệu
suất tốt nhất.
Hình họa sau ảnh hóa sự khác nhau giữa các multi-threaded servers và một Node.js server: