ไลบรารี TinyIO เสนอทางเลือกที่เรียบง่ายแทน AsyncIO Event Loop ที่ซับซ้อนของ Python

ทีมชุมชน BigGo
ไลบรารี TinyIO เสนอทางเลือกที่เรียบง่ายแทน AsyncIO Event Loop ที่ซับซ้อนของ Python

ไลบรารี 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 ใน thread
  • tinyio.sleep - coroutine สำหรับการหยุดพักแบบ asynchronous
  • tinyio.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