ขยายประสิทธิภาพของ asyncio บน Python แบบไม่มี GIL (Free-Threaded Python)
(labs.quansight.org)บทสรุป
ใน Python 3.14 รุ่น free-threaded นั้น asyncio ได้ ยกเลิก Global Interpreter Lock (GIL) และ เปลี่ยนไปใช้การจัดการสถานะแยกตามแต่ละเธรด ทำให้สามารถรันแบบขนานได้อย่างแท้จริง ผลลัพธ์คือ ประสิทธิภาพขยายตัวแบบเชิงเส้นตามจำนวนเธรด และสามารถรันหลาย event loop แบบขนานได้ เปิดโอกาสใหม่ให้กับแอปพลิเคชัน asyncio แบบมัลติเธรดสมรรถนะสูง
การเปลี่ยนแปลงสำคัญ
- ยกเลิก GIL (Global Interpreter Lock): free-threaded build ของ CPython ได้ลบ GIL ออก ทำให้หลายเธรดสามารถรันโค้ด Python พร้อมกันได้
- รับประกันความปลอดภัยของเธรด: asyncio ใช้ การจัดการสถานะแยกตามแต่ละเธรด แทนโครงสร้างข้อมูลแบบโกลบอล เพื่อให้ปลอดภัยต่อการใช้งานหลายเธรด
- การเก็บงาน: ใช้ รายการเชื่อมโยงคู่แบบวงกลมแยกตามเธรด แทน
WeakSetแบบโกลบอล เพื่อลดการแข่งขันในการล็อกและโอเวอร์เฮดจาก weak reference - การเก็บงานปัจจุบัน: เก็บ "งานปัจจุบัน" ไว้ในสถานะของเธรด ทำให้เข้าถึงได้เร็วขึ้นและไม่ต้องใช้ล็อก
- การเก็บงาน: ใช้ รายการเชื่อมโยงคู่แบบวงกลมแยกตามเธรด แทน
การปรับปรุงประสิทธิภาพ
- ประสิทธิภาพขยายตัวแบบเชิงเส้น: ผลการทดสอบ benchmark แสดงให้เห็นว่า ใน free-threaded build ประสิทธิภาพของ asyncio เพิ่มขึ้นแบบเชิงเส้น ตามจำนวนเธรดที่เพิ่มขึ้น
- TCP benchmark: เมื่อเทียบกับ build ที่ยังเปิดใช้ GIL พบว่า free-threaded build ให้ throughput สูงขึ้นอย่างมาก
- Web scraping benchmark: ในการทดสอบ web scraping ด้วย aiohttp เมื่อใช้ worker หลายตัวบน free-threaded build พบว่า ประสิทธิภาพดีขึ้นมากกว่า 2 เท่า
ยังไม่มีความคิดเห็น