- บทความนี้กล่าวถึงความท้าทายของการใช้ Rust กับซอฟต์แวร์ userspace ที่มีการทำงานพร้อมกันในระดับขนาดใหญ่
- โมเดลแบบอะซิงโครนัสของ Rust ถูกออกแบบมาเพื่อจัดการแนวคิดหลักสองประการของการประมวลผลสมัยใหม่ คือ concurrency และ parallelism
- parallelism คือการรันโค้ดพร้อมกันบน CPU หลายตัว
- concurrency คือการแยกปัญหาออกเป็นส่วนย่อยที่เป็นอิสระ และรันได้โดยไม่ขึ้นกับลำดับหรือมีเพียงลำดับบางส่วน
- บทความนี้เน้นข้อจำกัดของการใช้หลายโปรเซสเพื่อรองรับ concurrency เนื่องจากการสื่อสารระหว่างโปรเซสมีต้นทุนสูง
- เธรดซึ่งเป็นกระบวนการที่ใช้หน่วยความจำร่วมกัน ถูกเสนอเป็นทางเลือก แต่ก็อาจก่อให้เกิดปัญหาซับซ้อน เช่น race condition และ deadlock
- งานวิจัยปี 1978 ของ Tony Hoare เรื่อง "Communicating Sequential Processes" เสนอให้ใช้คิวหรือแชนเนลเพื่อให้เธรดส่งข้อความหากัน ซึ่งให้ข้อดีหลายประการ เช่น การแยกตัวคล้ายโปรเซสและการดีบักที่ง่ายกว่า
- ไลบรารีมาตรฐานของ Rust มีแชนเนลอยู่ภายใต้
std::sync::mpsc::sync_channel
- อย่างไรก็ตาม สำหรับปัญหาที่ต้องการ concurrency ในระดับสูง เช่น เว็บเซิร์ฟเวอร์ที่เชื่อมต่อกับผู้ใช้นับหมื่น เธรดเพียงอย่างเดียวอาจไม่เพียงพอ
- สำหรับสถานการณ์เช่นนี้ Rust ใช้โมเดล
async/await ซึ่งเมื่อฟังก์ชันถูกทำเครื่องหมายว่าเป็นแบบอะซิงโครนัส จะคืนค่า future หรือ promise และสามารถรอเพื่อสร้างผลลัพธ์ได้
- แม้จะมีข้อดี แต่ async Rust ก็มีความท้าทาย เช่น ความจำเป็นในการทำให้คอมไพเลอร์มั่นใจได้ว่าทุกอย่างจะทำงานได้ถูกต้อง ซึ่งอาจยากกว่าการใช้ raw threads
- มีการเสนอให้ใช้ "atomic reference count" หรือ Arc เป็นทางออก แต่ก็ไม่ใช่ยาครอบจักรวาล เพราะอาจก่อให้เกิดปัญหาคล้ายกับที่พบใน garbage collector
- บทความสรุปว่า แม้ Rust จะมีจุดแข็งในด้านอื่น ๆ แต่ก็อาจไม่ใช่เครื่องมือที่เหมาะที่สุดสำหรับซอฟต์แวร์ userspace ที่มีการทำงานพร้อมกันขนาดใหญ่
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News