ข้าม​ไป​ยัง​เนื้อหา

Async Rust ด้วย Tokio — Rust Systems IV

ต่อ​จาก Rust Systems III (#23): สาม​คอร์ส​แรก​ของ​ซีรีส์ Rust จงใจ​ไม่​แตะ async เลย และ kaen-kvstore ของ #22 รับ​คอน​เนกชัน​ด้วย ThreadPool ขนาด​คงที่ 4 worker ที่​หนึ่ง​คอน​เนกชัน​ยึด worker ไว้​ทั้ง​เส้น ปัญหา​จึง​ไม่ใช่ thread เยอะ​เกิน แต่​คือ worker ถูก block ทิ้ง​ไว้​ระหว่าง​รอ I/O — คอร์ส​นี้​เปิด​ประตู async จริง​เป็น​ครั้ง​แรก และ​เป็น​คอร์ส Rust ตัว​แรก​ของ​เว็บ​ที่ crate dependency เป็น​แกน​ของ​ทุก​บท (tokio 1.53.1 บน rustc 1.97.1 edition 2024 — #22 กับ #23 เป็น zero-crate จริง ส่วน #21 มี clap/serde/thiserror อยู่​แล้ว) เริ่ม​จาก​ข้อเท็จจริง​ที่​กัด​ที่สุด: เรียก async fn ใน Rust แล้ว​ไม่มี​อะไร​รัน​เลย เพราะ Future เป็น state machine แบบ lazy — เรา​จะ​พิสูจน์​ด้วย​การ​เขียน executor เอง​ราว 15 บรรทัด​ด้วย std ล้วน (poll / Poll / Waker / Pin) → แล้ว​ค่อย​เปลี่ยน​มา​ใช้ Tokio runtime ตัว​จริง​ที่​รวม executor + reactor (epoll ผ่าน mio) + timer ไว้​ด้วย​กัน → แตก​งาน​เป็น task ด้วย spawn และ JoinHandle → เขียน async I/O กับ TCP ที่​รับ​คอน​เนกชัน​จำนวน​มาก​ได้​โดย​ไม่​ต้อง​ยึด OS thread ไว้​หนึ่ง​ตัว​ต่อ​หนึ่ง​คอน​เนกชัน → แข่ง future ด้วย select! และ​เข้าใจ​ว่า "ยกเลิก" ใน​โลก async แปล​ว่า drop → share สถานะ​ข้าม task ด้วย Send, Mutex และ channel ที่​มี backpressure → เก็บกวาด​กับดัก​คลาสสิก (guard ค้าง​ข้าม .await, block runtime, function colouring) → ปิด​ท้าย​ด้วย capstone ที่​ยก kaen-kvstore จาก #22 ขึ้น​มา​อยู่​บน Tokio พร้อม graceful shutdown ครบ​วงจร ต่าง​จาก #23 ที่​คง​เรื่อง consensus ไว้​เป็นกล่อง​ไดอะแกรม คอร์ส​นี้​ไม่มี​บท​ไหน​เป็น​ไดอะแกรม​อย่าง​เดียว​เลย — ทุก snippet compile และ​รัน​ได้​จริง​ใน​แซนด์บ็อกซ์ (ยกเว้น snippet ที่​ติด​ป้าย ❌ ซึ่ง​ตั้งใจ​ให้​พัง และ​การ​กด Ctrl-C จริง​ที่​จำลอง​ด้วย mpsc) 8 บท​ลงมือ​จริง
ความคืบหน้า0 / 8 บทเรียน