- Bài viết này thảo luận về những thách thức khi sử dụng Rust cho phần mềm không gian người dùng có mức độ đồng thời quy mô lớn.
- Mô hình bất đồng bộ của Rust được thiết kế để xử lý hai khái niệm cốt lõi của điện toán hiện đại: đồng thời và song song.
- Song song bao gồm việc chạy mã cùng lúc trên nhiều CPU.
- Đồng thời bao gồm việc tách vấn đề ra và chia nó thành các phần độc lập để thực thi không phụ thuộc thứ tự hoặc theo thứ tự từng phần.
- Bài viết nhấn mạnh những hạn chế của việc dùng nhiều tiến trình cho tính đồng thời do chi phí giao tiếp liên tiến trình cao.
- Luồng, tức các tiến trình chia sẻ cùng một vùng nhớ, được đưa ra như một phương án thay thế, nhưng có thể dẫn đến các vấn đề phức tạp như race condition và deadlock.
- Bài báo năm 1978 của Tony Hoare, "Communicating Sequential Processes", đề xuất sử dụng hàng đợi hoặc channel để các luồng gửi thông điệp cho nhau, mang lại nhiều ưu điểm như tính cô lập kiểu tiến trình và khả năng gỡ lỗi dễ hơn.
- Thư viện chuẩn của Rust có channel trong
std::sync::mpsc::sync_channel.
- Tuy nhiên, với những bài toán đòi hỏi mức độ đồng thời rất cao, như máy chủ web kết nối với hàng chục nghìn người dùng, luồng có thể là chưa đủ.
- Rust dùng mô hình "async/await" cho các tình huống này, trong đó khi một hàm được đánh dấu bất đồng bộ, nó sẽ trả về một future hoặc promise và có thể được chờ để tạo ra kết quả.
- Dù có nhiều ưu điểm, Rust bất đồng bộ vẫn đi kèm các thách thức, chẳng hạn nhu cầu phải thuyết phục trình biên dịch rằng mọi thứ sẽ ổn; điều này có thể khó hơn so với dùng luồng thô.
- Việc sử dụng "đếm tham chiếu nguyên tử" hay Arc được đề xuất như một giải pháp, nhưng đây không phải liều thuốc vạn năng vì nó có thể dẫn tới các vấn đề tương tự như với bộ gom rác.
- Bài viết kết luận rằng, dù Rust có thế mạnh ở các lĩnh vực khác, nó có thể không phải là công cụ tối ưu cho phần mềm không gian người dùng có mức độ đồng thời quy mô lớn.
1 bình luận
Ý kiến trên Hacker News