3.
Async/non-blocking IO được implement như thế nào ?
Ở trên có nhắc tới tại sao
Async/non-blocking IO lại liên quan tới topic này.
Đơn giản là vì
Async/non-blocking IO nói dễ hiểu là 1 design pattern dựa trên multi-threading/concurrency.
Mình chỉ
async/non-blocking IO trên thread hiện tại -> phần
sync/blocking được off-load tới 1 worker-thread ( hoặc 1 thread khác, ko phải thread hiện tại)
.
Lấy
NodeJS built-in architecture làm ví dụ (
built-in nghĩa là support native của ngôn ngữ mà ko cần thêm 1 external lib, plugin hay extension nào cả)
nguồn
Medium của Rahul
Như hình trên thì
event_loop kia có thể hiểu là nó được chạy trên
worker-thread.
Main-thread sẽ được trigger/interrupt chỉ khi nào
callback-stack thực thi xong 1
callback nào đó.
Main-thread thì chỉ có 1 ( đây là lầm tưởng về NodeJS chỉ chạy được 1 thread) , nhưng
worker-thread thì nhiều hơn 1 ( default là số core * 2 , số core thì hình như V8 lấy thừ file
/proc/cpuinfo )
Luồng đơn giản:
- Main-thread gặp callback -> vứt vào callback-stack -> tiếp tục fetch event từ event_queue ( kết quả được tính toán từ worker-thread) -> main-thread trả về kết quả
- Worker-thread scan liên tục callback-stack -> xử lý callback -> đẩy kết quả vào event_queue
- event_queue nhận được event mới -> trigger/interrupt main-thread ( phần này đọc doc thì dùng OS libuv )
- trigger vs interrupt để tránh việc main-thread chỉ mải mê push callback vào stack mà ko đọc kết quả trả về