
Python 3.15 เปิดศักราชใหม่: รองรับ Stable ABI แบบ Free-Threading (abi3t) และ macOS ติดตั้งโหมดนี้เป็นค่าเริ่มต้น
Python 3.15 ออกแล้ว พร้อมกับการเปลี่ยนแปลงครั้งใหญ่: เปิดตัว Stable ABI แบบใหม่ชื่อ “abi3t” สำหรับ free-threaded builds (หรือพูดง่ายๆ คือ Python แบบไม่มี GIL) และบน macOS ตัวติดตั้งทางการก็เปิด free-threading เป็นโหมดเริ่มต้นทันที docs.python.org peps.python.org python.org. นักพัฒนา extension ที่เขียนด้วยภาษา C จะต้องปรับตัวกับ ABI แบบใหม่นี้ โดยเฉพาะถ้าต้องการให้แพ็กเกจของตัวเองรันได้ทั้งบน Python แบบมี GIL และแบบ free-threading. ข่าวนี้อาจดูไกลตัว แต่จริง ๆ แล้วมีผลกับทั้งสายงานวิทยาศาสตร์ข้อมูล โปรแกรมเมอร์ทั่วไป และเจ้าของธุรกิจที่ใช้ Python ในงานประจำวัน.
สรุป 30 วินาที: เกิดอะไรขึ้น
- Python 3.15 เปิดตัว Stable ABI แบบใหม่ (abi3t) สำหรับ free-threaded builds ตามข้อเสนอใน PEP 803 peps.python.org.
- macOS official installer ตั้งค่า free-threading เป็นค่าเริ่มต้นทันที docs.python.org.
- นักพัฒนา C extension ต้องใช้แนวทาง PyModExport/PEP 697 เพื่อรองรับ ABI แบบใหม่นี้
- บรรดาแพ็กเกจวิทยาศาสตร์และ extension ที่ต้องการรันได้กับ Python 3.15+ ทุกแบบ จะต้อง build ล้อ (wheel) แบบใหม่ที่รองรับทั้ง abi3 และ abi3t
- ลดภาระการดูแลและการ build หลายเวอร์ชันสำหรับผู้ดูแลแพ็กเกจ แต่ต้องปรับตัวกับข้อจำกัดใหม่
- ผลกระทบมากกับสายงาน data science, machine learning, และแพ็กเกจที่มี C extension
ทำไมเรื่องนี้เกี่ยวกับคุณ
ถ้าคุณใช้ Python ในงานประจำ ไม่ว่าจะเป็นการวิเคราะห์ข้อมูล เขียนสคริปต์อัตโนมัติ หรือรันโปรแกรมบนเครื่อง macOS ข่าวนี้มีผลโดยตรงกับคุณ เพราะ:
- macOS ติดตั้ง Python 3.15 แบบ free-threading เป็นค่าเริ่มต้นแล้ว นั่นหมายความว่า extension เก่า ๆ ที่ไม่รองรับ free-threading อาจใช้งานไม่ได้หรือเกิดปัญหา docs.python.org.
- แพ็กเกจยอดนิยมที่มี C extension เช่น numpy, scipy, cryptography, หรือแม้แต่โมดูลที่ใช้ในงานวิทยาศาสตร์ข้อมูล อาจต้องรอการอัปเดต wheel ใหม่ให้รองรับ abi3t
- หากคุณเป็นเจ้าของธุรกิจหรือดูแลระบบที่ใช้งาน Python บน macOS หรือเตรียมอัปเกรดเวอร์ชัน อาจต้องทดสอบความเข้ากันได้กับ extension ต่าง ๆ
- สำหรับนักพัฒนา extension: การ build wheel จะง่ายขึ้นในระยะยาว เพราะไม่ต้อง build แยกตามเวอร์ชันย่อยของ Python อีกต่อไป แต่ต้องปรับโค้ดให้เข้ากับข้อจำกัดของ ABI แบบใหม่
- ถ้าคุณเป็นแค่ผู้ใช้ทั่วไป อาจเจอปัญหา install แพ็กเกจแล้วใช้งานไม่ได้ในช่วงแรก ๆ ของ Python 3.15
ทำงานยังไง
ก่อนหน้านี้ Python มี GIL (Global Interpreter Lock) ซึ่งเป็นกลไกที่บังคับให้ในแต่ละเวลามีแค่ thread เดียวที่รัน Python bytecode ได้จริง ๆ ต่อให้โค้ดคุณใช้ threading ก็ยังติดขัดที่ GIL อยู่ดี ผลคือ extension ที่เขียนด้วย C สามารถอาศัยโครงสร้างข้อมูลภายใน (PyObject) ได้เต็มที่โดยไม่ต้องกังวลเรื่อง race condition มากนัก peps.python.org.
แต่เมื่อ Python เดินหน้าสู่ free-threading (ไม่มี GIL) โครงสร้างข้อมูลภายในต้องถูกซ่อน (opaque) เพื่อป้องกันปัญหา thread ปะทะกัน Extension ที่เคยเข้าถึง PyObject โดยตรงจะทำแบบเดิมไม่ได้อีก ต้องใช้ API ที่จำกัดมากขึ้น (เรียกว่า Limited API) และตอนนี้ก็มี Stable ABI แบบใหม่ชื่อ abi3t (t = threading) สำหรับ free-threaded build โดยเฉพาะ
ถ้าเปรียบกับชีวิตประจำวัน สมมติว่าคุณมี “รถสองระบบเกียร์” คือรถที่เปลี่ยนจากเกียร์ธรรมดาเป็นเกียร์อัตโนมัติได้ แต่ช่างซ่อมต้องใช้อะไหล่ที่รองรับทั้งสองระบบ ถ้าอะไหล่เก่าใช้ได้แค่กับเกียร์ธรรมดา (GIL) ก็จะใส่กับรถรุ่นใหม่ (free-threading) ไม่ได้ ต้องเปลี่ยนไปใช้อะไหล่แบบใหม่ (abi3t) ที่ออกแบบมาให้ใช้ได้กับทั้งสองระบบ
สำหรับ extension authors ที่ต้องการรองรับทั้งสองแบบ จะต้อง build wheel ที่มี tag ว่า abi3.abi3t และใช้แนวทาง PyModExport/PEP 697 เพื่อให้ extension ของตัวเองโหลดได้ทั้งบน Python แบบ GIL และแบบ free-threading peps.python.org.
จุดหักมุม: macOS ล้ำหน้า Windows
แม้ Windows จะยังใช้ Python แบบมี GIL เป็นค่าเริ่มต้น แต่บน macOS ทาง Python.org เลือกเปิด free-threading เป็น default ทันทีในเวอร์ชัน 3.15 docs.python.org. ส่งผลให้ผู้ใช้ macOS จะเป็นกลุ่มแรก ๆ ที่ได้สัมผัสกับโลก Python แบบใหม่ก่อนใครเพื่อน (แต่ก็เสี่ยงเจอปัญหา compatibility ก่อนด้วยนะครับ)
เรื่องเงิน / ผลกระทบ
- สำหรับผู้ดูแลแพ็กเกจและองค์กร: ลดค่าใช้จ่ายและเวลาที่ต้อง build wheel หลายเวอร์ชันต่อ release เพราะ stable ABI แบบใหม่ (abi3t) ทำให้ build ครั้งเดียวใช้ได้กับ Python หลายเวอร์ชันและทั้งสองโหมด (GIL/Free-threading) peps.python.org.
- ผู้ใช้ทั่วไปอาจต้องรอแพ็กเกจยอดนิยมอัปเดต wheel ใหม่ในช่วงแรกของ Python 3.15 โดยเฉพาะบน macOS
- ธุรกิจที่ใช้ Python ใน production อาจต้องวางแผนทดสอบและอัปเดต dependency ให้ทันกับการเปลี่ยนแปลงนี้
- นักพัฒนา extension ที่ไม่ปรับตัวกับ ABI ใหม่ อาจเสียลูกค้าหรือผู้ใช้ที่อัปเกรด Python ไปแล้ว
ข้อมูลที่ยังไม่ชัด และจุดที่แหล่งข่าวพูดไม่ตรงกัน
- ยังไม่มีข้อมูลแน่ชัดว่าแพ็กเกจยอดนิยมทั้งหมดจะออก wheel ที่รองรับ abi3t พร้อมกับ Python 3.15 หรือไม่ realpython.com
- บางโครงการ (เช่น Cython) ยังลังเลเรื่อง trade-off ด้าน performance เมื่อใช้ stable ABI แบบใหม่ peps.python.org
- ยังไม่ชัดเจนว่าบน Windows official installer จะเปลี่ยนมาใช้ free-threading เป็น default เมื่อไร (ใน Python 3.15 ยังเป็นแบบเดิม)
- รายละเอียดเกี่ยวกับ API ที่ binding generator อย่าง nanobind ต้องการ ยังอยู่ระหว่างการหารือ
แล้วเราควรทำอะไร
สำหรับผู้ใช้ทั่วไป (นักเรียน นักศึกษา พนักงานออฟฟิศ)
- ถ้าใช้ macOS และติดตั้ง Python 3.15 ใหม่ ให้ตรวจสอบว่าแพ็กเกจที่ต้องใช้รองรับ free-threading หรือยัง
- ถ้า install แพ็กเกจแล้วเจอ error เกี่ยวกับ ABI หรือ extension โหลดไม่ได้ ให้ลองเช็คอัปเดต หรือรอ wheel ใหม่จากผู้ดูแลแพ็กเกจ
- หลีกเลี่ยงการอัปเกรด Python บน production หรือเครื่องที่ใช้งานจริงทันที ควรทดสอบก่อน
สำหรับเจ้าของธุรกิจ/IT
- วางแผนทดสอบระบบที่ใช้ Python 3.15 โดยเฉพาะบน macOS
- ประสานกับผู้ดูแลแพ็กเกจหรือทีม dev ว่า dependency สำคัญรองรับ abi3t แล้วหรือยัง
- เตรียม rollback หรือใช้ virtual environment แยกสำหรับ Python 3.15
สำหรับนักพัฒนา extension (C/C++/Rust)
- ศึกษา PEP 803 และแนวทาง PyModExport/PEP 697 เพื่อปรับโค้ดให้รองรับ stable ABI ใหม่ (abi3t) peps.python.org
- Build wheel ที่รองรับทั้ง abi3 และ abi3t (tag: abi3.abi3t)
- ทดสอบ extension ของตัวเองบนทั้ง Python แบบ GIL และแบบ free-threading
- ถ้าใช้ binding generator เช่น PyO3, CFFI, Cython ให้เช็คว่ารองรับ abi3t แล้วหรือยัง
ผมมองว่า…
ผมมองว่า การเปลี่ยนแปลงนี้ “ไม่ใช่แค่เรื่องเทคนิคของนักพัฒนา C extension” แต่คือการเปลี่ยนโฉม ecosystem Python ทั้งระบบ โดยเฉพาะกับผู้ใช้ทั่วไปที่อาจไม่รู้ตัวว่าอยู่ในยุคเปลี่ยนผ่านของ Python แบบไม่มี GIL แล้ว การที่ macOS เลือกเปิด free-threading เป็น default ก่อน Windows ก็สะท้อนว่า Python community จริงจังกับการพัฒนาไปข้างหน้า แม้จะมีความเสี่ยงกับ compatibility ในระยะสั้น แต่ระยะยาวจะช่วยลดภาระงาน build และการดูแลโค้ดอย่างมาก
ปิดท้าย: สิ่งที่ต้องจับตา
- การออก wheel ใหม่ของแพ็กเกจยอดนิยม เช่น numpy, scipy, cryptography, pydantic-core ฯลฯ ว่าจะรองรับ abi3t ได้เร็วแค่ไหน
- การปรับตัวของ binding generator (PyO3, CFFI, Cython, nanobind) ให้รองรับ ABI ใหม่แบบสมบูรณ์
- ทิศทางของ Windows installer ว่าจะเปลี่ยนมาใช้ free-threading เป็น default เมื่อไร
- ประสบการณ์ผู้ใช้บน macOS ว่าจะเจอปัญหา extension โหลดไม่ได้มากน้อยแค่ไหนในช่วงเปลี่ยนผ่าน
Recap
- Python 3.15 ออก stable ABI แบบใหม่ (abi3t) สำหรับ free-threaded builds
- macOS ติดตั้ง Python 3.15 แบบ free-threading เป็นค่าเริ่มต้น
- นักพัฒนา extension ต้องปรับโค้ดและ build wheel ให้รองรับทั้ง abi3/abi3t
- ผู้ใช้ macOS อาจเจอปัญหาแพ็กเกจ extension โหลดไม่ได้ในช่วงแรก
- ธุรกิจ/องค์กรควรทดสอบระบบก่อนอัปเกรด Python 3.15
- จับตาการอัปเดต wheel ของแพ็กเกจยอดนิยมและ binding generator
(chars/words reported by checker: 7876/1962)
Sources used: