sync/async
sync/async
Chờ là phần lớn thời gian của một chương trình có nối mạng. Ba chặng, đi từ nhận ra mình đang chờ tới chờ nhiều việc cùng lúc mà không rối.
9 cột mốc · 2 có bài trong app
Bắt đầu
1Nhận ra mình đang chờ
Phân biệt việc tốn CPU với việc chỉ ngồi đợi — hai thứ cần cách xử lý khác hẳn nhau.
- Blockingcó bàiViệc sau bị chặn cho tới khi việc trước xong, kể cả khi việc trước chỉ đang ngồi đợi mạng.
- Chờ mạng khác tính toántự tìm hiểuChờ thì CPU rảnh; tính toán thì CPU bận. Async chỉ giúp được loại thứ nhất.
- Promise · async/awaittự tìm hiểuCách viết code chờ mà đọc như code chạy thẳng.
2Chờ nhiều việc cùng lúc
Cho các khoảng chờ chồng lên nhau, thay vì nối đuôi.
- Promise.allcó bàiPhát hết rồi chờ chung: tổng thời gian bằng việc chậm nhất, không phải tổng các việc.
- Khi nào bắt buộc phải tuần tựtự tìm hiểuViệc B cần kết quả của A thì không có cách nào song song. Tuần tự không phải kẻ xấu.
- allSettled · race · anytự tìm hiểuBa luật chờ khác nhau: chờ hết kể cả có cái lỗi, lấy cái xong trước, lấy cái thành công đầu tiên.
3Khi việc chờ thành rắc rối
Biết ba kiểu hỏng mà code bất đồng bộ hay mắc.
- Quên awaittự tìm hiểuHàm trả về một lời hứa chứ không phải kết quả, và code chạy tiếp như chưa có gì xảy ra.
- Lỗi bị nuốttự tìm hiểuPromise lỗi mà không ai bắt thì im lặng. Đây là lý do phải có try/catch quanh await.
- Vòng lặp gọi tuần tựtự tìm hiểuawait trong for biến mười việc song song được thành mười lần chờ nối đuôi.
Đích
Lộ trình dừng ở đây
Ba chặng trên đủ cho phần lớn code bất đồng bộ bạn viết. Phần dưới là hướng đi tiếp.
- Event loopCơ chế quyết định thứ tự chạy nằm dưới tất cả những thứ trên — có bài riêng trong app.
- Huỷ một việc đang chờAbortController: bỏ giữa chừng một request không còn cần nữa.
- Giới hạn số việc chạy cùng lúcPhát một nghìn request cùng lúc thì máy chủ bên kia không cảm ơn bạn.
- Thử lại và backoffMạng lỗi thì thử lại, nhưng thưa dần chứ không dồn dập.