ไลบรารี Python ใหม่ที่ชื่อ TinyIO ได้เกิดขึ้นเป็นทางเลือกที่มีน้ำหนักเบาแทน AsyncIO event loop มาตรฐาน โดยตอบสนองความผิดหวังที่นักพัฒนาพบบ่อยกับเฟรมเวิร์กการเขียนโปรแกรมแบบ asynchronous ที่มีอยู่ใน Python ไลบรารีที่มีเพียง 200 บรรทัดนี้สัญญาว่าจะทำให้การจัดการ event loop ง่ายขึ้น พร้อมทั้งให้การจัดการข้อผิดพลาดที่ดีกว่าสำหรับการใช้งานพื้นฐาน
การติดตั้งและขนาด:
- การติดตั้ง:
pip install tinyio
- ขนาดไลบรารี: ประมาณ 200 บรรทัดของโค้ด
- รองรับ nested loops (ไม่เหมือน asyncio ที่มีข้อจำกัดหนึ่งลูปต่อเธรด)
ไวยากรณ์ที่เรียบง่ายโดยใช้ Yield แทน Await
TinyIO ใช้วิธีการที่ไม่ธรรมดาโดยใช้คำสั่ง yield
ของ Python แทนคีย์เวิร์ด await
มาตรฐานสำหรับการทำงานของ coroutine การเลือกออกแบบนี้เกิดจากการพิจารณาเชิงปฏิบัติมากกว่าความชอบเชิงสไตล์ ไวยากรณ์ await
แบบดั้งเดิมต้องการคลาสแรปเปอร์เพิ่มเติมเพื่อให้จุดหยุดชั่วคราวแก่ event loop ในขณะที่ yield
เสนอความสามารถในการหยุดชั่วคราวโดยตรง ทำให้ coroutine ของ TinyIO เป็นฟังก์ชัน generator โดยพื้นฐาน ซึ่งนักพัฒนาหลายคนพบว่าเข้าใจและดีบักได้ง่ายกว่า
ไลบรารีรองรับการทำงาน yield พื้นฐานสามแบบ: การ yield ไม่มีอะไรเพื่อหยุดการทำงานชั่วคราว การ yield coroutine เดียวเพื่อรอให้เสร็จสิ้น และการ yield รายการของ coroutine เพื่อรอการทำงานหลายอย่างพร้อมกัน
การดำเนินการ Yield ใน TinyIO :
yield
- หยุดการทำงานชั่วคราว อนุญาตให้ coroutine อื่นๆ ทำงานได้yield coro
- รอให้ coroutine เดียวทำงานเสร็จสิ้นyield [coro1, coro2, ...]
- รอให้ coroutine หลายตัวทำงานเสร็จ (เทียบเท่ากับ asyncio gather/trio nursery)
การแพร่กระจายข้อผิดพลาดอย่างรุนแรงในทุกการทำงาน
หนึ่งในคุณลักษณะที่โดดเด่นที่สุดของ TinyIO คือวิธีการจัดการข้อผิดพลาด เมื่อ coroutine ใดๆ เกิดข้อยกเว้น ไลบรารีจะยกเลิก coroutine อื่นๆ ทั้งหมดใน event loop ทันทีโดยการเรียก CancelledError
ณ จุด yield ปัจจุบันของพวกมัน สิ่งนี้ขยายไปถึงฟังก์ชันแบบ synchronous ที่ทำงานใน thread ผ่านฟีเจอร์ run_in_thread
ด้วย
หาก coroutine ใดเกิดข้อผิดพลาด coroutine ทั้งหมดใน loop ทั้งหมดจะมี tinyio.CancelledError เกิดขึ้นจากจุด yield ใดก็ตามที่พวกมันกำลังรออยู่
กลยุทธ์การยกเลิกที่รุนแรงนี้ช่วยให้แอปพลิเคชันล้มเหลวอย่างรวดเร็วและสมบูรณ์ ให้โอกาสทุกส่วนประกอบในการทำความสะอาดทรัพยากรอย่างสง่างามก่อนปิดระบบ
ส่วนประกอบหลักของ API ใน TinyIO :
tinyio.Loop
- คลาสของ event loop หลักที่มีเมธอด.run(coro)
เดียวtinyio.run_in_thread
- ใช้สำหรับรันฟังก์ชันแบบ synchronous ใน threadtinyio.sleep
- coroutine สำหรับการหยุดพักแบบ asynchronoustinyio.CancelledError
- exception ที่เกิดขึ้นระหว่างการยกเลิก
การตอบรับจากชุมชนและบริบททางประวัติศาสตร์
ชุมชน Python แสดงความสนใจในแนวทางของ TinyIO โดยการอภิปรายเผยให้เห็นความเชื่อมโยงกับการทดลองการเขียนโปรแกรมแบบ asynchronous ในยุคก่อน นักพัฒนาบางคนสังเกตเห็นความคล้ายคลึงกับ Tulip ซึ่งเป็นเฟรมเวิร์ก asynchronous ของ Python ในยุคแรกที่สร้างโดย Guido van Rossum ผู้สร้าง Python และไลบรารีอื่นๆ เช่น Curio ที่สำรวจแนวทางทางเลือกในการเขียนโปรแกรม async
สมาชิกชุมชนชื่นชมไวยากรณ์ที่ใช้ yield โดยเฉพาะ โดยพบว่าเข้าใจง่ายกว่าความซับซ้อนของ AsyncIO ผู้สร้างไลบรารีมีส่วนร่วมกับผู้ใช้อย่างแข็งขัน แสดงให้เห็นการตอบสนองของโครงการต่อข้อเสนอแนะและคำถามของนักพัฒนา
การรวม Threading และการรองรับ Nested Loop
TinyIO ให้การรวมที่ราบรื่นกับการทำงานแบบ thread ผ่านฟังก์ชัน run_in_thread
ทำให้นักพัฒนาสามารถผสมโค้ดแบบ synchronous และ asynchronous ได้อย่างธรรมชาติ ไลบรารียังรองรับ nested event loop ภายใน thread เดียวกัน ขจัดข้อจำกัดของ AsyncIO ที่มี loop หนึ่งอันต่อ thread
ความยืดหยุ่นนี้ทำให้ TinyIO เหมาะสำหรับแอปพลิเคชันที่ต้องการรวมกับโค้ดเบส synchronous ที่มีอยู่หรือต้องการการทำงาน async แบบซ้อนที่ซับซ้อน
ไลบรารีนี้แสดงถึงโซลูชันที่มุ่งเน้นสำหรับนักพัฒนาที่ต้องการฟังก์ชันการทำงาน event loop พื้นฐานโดยไม่มีความซับซ้อนของ AsyncIO แม้ว่าจะตั้งใจกำหนดเป้าหมายไปที่การใช้งานที่เรียบง่ายมากกว่าการพยายามแทนที่ชุดฟีเจอร์ครบครันของ AsyncIO
อ้างอิง: tinyio