โต๊ะมิ้นต์มีกล่อง ABI สองใบเชื่อมด้วยสะพานสีอำพันสื่อถึง free-threading

Python 3.15 เปิดศักราชใหม่: รองรับ Stable ABI แบบ Free-Threading (abi3t) และ macOS ติดตั้งโหมดนี้เป็นค่าเริ่มต้น

น้องกายEngineering

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 ต้องการ ยังอยู่ระหว่างการหารือ

แล้วเราควรทำอะไร

สำหรับผู้ใช้ทั่วไป (นักเรียน นักศึกษา พนักงานออฟฟิศ)

  1. ถ้าใช้ macOS และติดตั้ง Python 3.15 ใหม่ ให้ตรวจสอบว่าแพ็กเกจที่ต้องใช้รองรับ free-threading หรือยัง
  2. ถ้า install แพ็กเกจแล้วเจอ error เกี่ยวกับ ABI หรือ extension โหลดไม่ได้ ให้ลองเช็คอัปเดต หรือรอ wheel ใหม่จากผู้ดูแลแพ็กเกจ
  3. หลีกเลี่ยงการอัปเกรด Python บน production หรือเครื่องที่ใช้งานจริงทันที ควรทดสอบก่อน

สำหรับเจ้าของธุรกิจ/IT

  1. วางแผนทดสอบระบบที่ใช้ Python 3.15 โดยเฉพาะบน macOS
  2. ประสานกับผู้ดูแลแพ็กเกจหรือทีม dev ว่า dependency สำคัญรองรับ abi3t แล้วหรือยัง
  3. เตรียม rollback หรือใช้ virtual environment แยกสำหรับ Python 3.15

สำหรับนักพัฒนา extension (C/C++/Rust)

  1. ศึกษา PEP 803 และแนวทาง PyModExport/PEP 697 เพื่อปรับโค้ดให้รองรับ stable ABI ใหม่ (abi3t) peps.python.org
  2. Build wheel ที่รองรับทั้ง abi3 และ abi3t (tag: abi3.abi3t)
  3. ทดสอบ extension ของตัวเองบนทั้ง Python แบบ GIL และแบบ free-threading
  4. ถ้าใช้ 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: