Fearless Concurrency
การจัดการ programming แบบ concurrent อย่างปลอดภัยและมีประสิทธิภาพเป็น อีกหนึ่งเป้าหมายหลักของ Rust Concurrent programming ที่ส่วนต่าง ๆ ของโปรแกรม execute อย่างอิสระ และ parallel programming ที่ส่วน ต่าง ๆ ของโปรแกรม execute พร้อมกัน กำลังสำคัญเพิ่มขึ้นเมื่อ computer มากขึ้นใช้ประโยชน์จาก processor หลายตัวของพวกมัน ในอดีต programming ใน context เหล่านี้ยากและมีแนวโน้ม error Rust หวังที่จะเปลี่ยนนั้น
ในตอนแรก ทีม Rust คิดว่าการรับประกัน memory safety และการป้องกัน ปัญหา concurrency เป็นสองความท้าทายแยกที่จะถูกแก้ด้วยวิธีต่าง ๆ เมื่อเวลาผ่านไป ทีมค้นพบว่าระบบ ownership และ type เป็นชุดเครื่องมือ ที่ทรงพลังที่ช่วยจัดการปัญหา memory safety และ concurrency! โดย ใช้ ownership และการตรวจสอบ type, error concurrency หลายอย่างเป็น error ที่ compile-time ใน Rust ไม่ใช่ error ที่ runtime ดังนั้น แทนการให้คุณใช้เวลามากพยายาม reproduce สถานการณ์แน่นอนที่ bug concurrency ที่ runtime เกิด โค้ดที่ไม่ถูกต้องจะปฏิเสธที่จะคอมไพล์ และเสนอ error ที่อธิบายปัญหา ผลคือ คุณแก้โค้ดของคุณในขณะที่คุณ ทำงานบนมัน ไม่ใช่อาจจะหลังจากมันถูก ship ไป production เราตั้ง ชื่อเล่นแง่มุมนี้ของ Rust ว่า fearless concurrency Fearless concurrency อนุญาตให้คุณเขียนโค้ดที่ปลอดจาก bug ที่ละเอียดอ่อนและ ง่ายที่จะ refactor โดยไม่แนะนำ bug ใหม่
สังเกต — เพื่อความง่าย เราจะอ้างถึงปัญหาหลายอย่างว่า concurrent ไม่ใช่แม่นยำขึ้นโดยพูด concurrent และ/หรือ parallel สำหรับบทนี้ โปรดทดแทนในใจ concurrent และ/หรือ parallel เมื่อใดก็ตามที่เราใช้ concurrent ในบทถัดไปที่ความแตกต่างสำคัญกว่า เราจะเจาะจงขึ้น
ภาษาหลายภาษามีความเชื่ออย่างแน่นแฟ้นเกี่ยวกับวิธีแก้ที่พวกมันเสนอ สำหรับการจัดการปัญหา concurrent ตัวอย่างเช่น Erlang มี functionality สง่างามสำหรับ concurrency แบบ message-passing แต่มีเพียงวิธีคลุมเครือ ในการแชร์ state ระหว่างเธรด การสนับสนุนเพียง subset ของวิธีแก้ที่ เป็นไปได้เป็นกลยุทธ์ที่สมเหตุสมผลสำหรับภาษาระดับสูงเพราะภาษาระดับสูง สัญญาประโยชน์จากการยอมเสียการควบคุมบางอย่างเพื่อรับ abstraction อย่างไรก็ตาม ภาษาระดับต่ำถูกคาดหวังให้วิธีแก้กับ performance ที่ดี ที่สุดในสถานการณ์ใดก็ตามและมี abstraction น้อยลงเหนือ hardware ดังนั้น Rust เสนอเครื่องมือที่หลากหลายสำหรับ model ปัญหาในแบบใดที่ เหมาะสมสำหรับสถานการณ์และข้อกำหนดของคุณ
นี่คือหัวข้อที่เราจะครอบคลุมในบทนี้:
- วิธีสร้างเธรดเพื่อรันโค้ดหลายชิ้นพร้อมกัน
- Concurrency แบบ Message-passing ที่ channel ส่งข้อความระหว่างเธรด
- Concurrency แบบ Shared-state ที่หลายเธรดมีสิทธิ์เข้าถึงข้อมูล บางตัว
- trait
SyncและSendที่ขยายการรับประกัน concurrency ของ Rust ไปยัง type ที่ user นิยามรวม type ที่ standard library ให้มา