Nhìn lại năm đầu tiên của Python free-threaded
(labs.quansight.org)- Python free-threaded được thiết kế để tận dụng hiệu quả phần cứng đa lõi
- Trong CPython 3.14, độ an toàn luồng và hiệu năng của các mô-đun cốt lõi đã được cải thiện đáng kể
- Vẫn còn nhiều gói quan trọng chưa hỗ trợ bản dựng free-threaded
- Bất kỳ ai cũng có thể cùng thúc đẩy sự phát triển này thông qua báo cáo từ môi trường sử dụng thực tế và đóng góp cho cộng đồng
Tổng quan
Tuần trước, CPython 3.14.0b1 đã được công bố, và tuần này PyCon 2025 bắt đầu tại Pittsburgh
Hai sự kiện này là những cột mốc quan trọng đối với việc phát hành và ổn định hóa Python free-threaded
Bài viết này nhìn lại chặng đường trong một năm qua, đồng thời giải thích cách đội ngũ Quansight đã đóng vai trò then chốt trong việc thử nghiệm áp dụng bản dựng free-threaded vào các quy trình sản xuất thực tế với phụ thuộc phức tạp
Ý nghĩa và sự cần thiết của Python free-threaded
- Hỗ trợ Python free-threaded cho phép khai thác toàn bộ tài nguyên tính toán của phần cứng hiện đại, nơi CPU và GPU đa lõi đã trở nên phổ biến
- Với cách tiếp cận GIL (Global Interpreter Lock) truyền thống, muốn tận dụng đầy đủ các thuật toán song song thì cần các cách lách và tinh chỉnh riêng
- Thông thường người ta dùng multiprocessing thay vì mô-đun threading, nhưng cách này có chi phí tạo tiến trình lớn và việc sao chép dữ liệu cũng kém hiệu quả
- Với các gói Python có chứa mã native, bản dựng free-threaded không thể tương thích ngay, nên bắt buộc phải rà soát mã để đảm bảo an toàn luồng
- Việc gỡ bỏ GIL đòi hỏi những thay đổi cấu trúc sâu trong trình thông dịch CPython, đồng thời cũng làm lộ ra các vấn đề cấu trúc trong những gói hiện có
Các thành quả chính
- Cùng với đội ngũ Python runtime của Meta, họ đã đóng góp hỗ trợ Python free-threaded cho nhiều gói và dự án như sau
- Công cụ đóng gói và workflow như meson, meson-python, setup-python GitHub Actions, packaging, pip, setuptools
- Trình tạo binding như Cython, pybind11, f2py, PyO3
- Các gói cốt lõi của hệ sinh thái PyData như NumPy, SciPy, PyArrow, Matplotlib, pandas, scikit-learn, scikit-image
- Các phụ thuộc quan trọng có lượt tải cao trên PyPI như Pillow, PyYAML, yarl, multidict, frozenlist
- Các gói phổ biến chưa hỗ trợ như CFFI, cryptography, PyNaCl, aiohttp, SQLAlchemy, grpcio cùng các thư viện machine learning như safetensors, tokenizers cũng đang được xử lý dần
- Các nhà phát triển lõi CPython trong đội Quansight đã đưa các cải tiến sau vào phiên bản 3.14
- Mô-đun warnings giờ mặc định hoạt động an toàn luồng trong bản dựng free-threaded
- Cải thiện các vấn đề nghiêm trọng về an toàn luồng của asyncio và tăng khả năng mở rộng song song
- Cải thiện toàn diện về an toàn luồng trong mô-đun ctypes
- Tăng hiệu năng của garbage collector free-threaded
- Tối ưu hóa cơ chế deferred reference counting và adaptive specializing interpreter
- Sửa nhiều lỗi và bổ sung an toàn luồng trên diện rộng
- Họ cũng đã viết một hướng dẫn toàn diện1 cho việc hỗ trợ Python free-threaded, cung cấp tài liệu tham khảo thực tiễn để nhiều gói hơn có thể áp dụng trong tương lai
Hiện trạng hệ sinh thái Python free-threaded
- Một năm trước, vào thời điểm phát hành 3.13.0b1, việc cài đặt phần lớn các gói Python trên bản dựng free-threaded gần như hỏng hoàn toàn
- Nguyên nhân khiến quá trình build thất bại không phải là vấn đề nền tảng, mà chủ yếu do các tùy chọn mặc định chưa được hỗ trợ hoặc những giả định nhỏ bị phá vỡ
- Trong một năm qua, họ đã phối hợp với cộng đồng để giải quyết nhiều vấn đề, và đặc biệt Cython 3.1.0 hỗ trợ chính thức đã trở thành bước ngoặt lớn
- Vẫn còn các gói có chứa mã biên dịch nhưng chưa cung cấp wheel free-threaded
Có thể theo dõi tiến độ của chúng trong các bảng theo dõi thủ công và tự động2
Các thách thức trước mắt
- Hiện tại, bản dựng Python free-threaded đang ở giai đoạn cần được thử nghiệm và nhận phản hồi trong các workflow thực tế
- Những workflow mà chi phí dùng multiprocessing cao có thể đặc biệt được cải thiện hiệu năng, nhưng việc rà soát độ ổn định luồng chi tiết cho từng gói là bắt buộc
- Nhiều thư viện cung cấp cấu trúc dữ liệu có thể thay đổi, nhưng tài liệu về an toàn luồng hoặc bảo đảm an toàn thực tế vẫn còn thiếu
- Với các gói lớn và có nhiều di sản, thường thiếu người có thể nắm đầy đủ mã nguồn, khiến việc hỗ trợ bị chậm lại
- Ở cấp độ cộng đồng, cần có nỗ lực nhằm bảo đảm tính bền vững trong việc duy trì các gói cốt lõi
Cách đóng góp
- Có thể tham khảo hướng dẫn đóng góp trong hướng dẫn chính thức
- Việc theo dõi các vấn đề của toàn hệ sinh thái và các tài liệu tương thích quan trọng được quản lý trong kho free-threaded-compatibility5
- Có thể tham gia thảo luận và đóng góp qua Discord cộng đồng do Quansight-Labs tổ chức6
Thông tin về bài nói sắp tới tại PyCon
- Tác giả bài viết và thành viên nhóm Lysandros Nikolaou sẽ thuyết trình tại PyCon 2025
- Họ dự định chia sẻ các ví dụ porting thực tế và kinh nghiệm rút ra từ quá trình triển khai, đồng thời cũng sẽ cung cấp video ghi hình trên YouTube
- Họ tin rằng bản dựng free-threaded là tương lai của ngôn ngữ Python và rất kỳ vọng được góp phần biến điều đó thành hiện thực
- Họ hy vọng những nỗ lực hôm nay sẽ trở thành bước ngoặt mở ra tương lai cho hệ sinh thái gói phong phú và đồ sộ mà hàng triệu lập trình viên sử dụng mỗi ngày
1 bình luận
Ý kiến trên Hacker News
Nhiều người dùng multiprocessing, và có nhắc đến việc chi phí tạo process là khá đắt
Có tính năng SharedMemory, nhưng không hiểu vì sao nó không được dùng thường xuyên hơn
Nhấn mạnh rằng trải nghiệm dùng ShareableList là rất tốt
Trên Unix, tốc độ tạo process ở mức dưới 1ms
ShareableList chỉ có thể chia sẻ scalar nguyên tử và bytes·chuỗi
Đã có trải nghiệm rất thành công khi chia sẻ mảng numpy
Vì process chết độc lập, nên nếu một process chết trong lúc đang sửa cấu trúc dữ liệu shared memory khi vẫn giữ lock thì rất khó phục hồi
Shared memory chỉ hoạt động trên phần cứng chuyên dụng
Tò mò liệu việc loại bỏ GIL có tác động nào khác đến mã Python đa luồng ngoài xử lý song song hay không
Hiểu rằng lý do GIL được giữ lại không phải vì multithread phụ thuộc vào GIL, mà vì việc bỏ GIL khiến việc triển khai interpreter và C extension phức tạp hơn, đồng thời làm chậm mã đơn luồng
Tò mò liệu Free-threaded Python có vẫn giữ bảo đảm cũ là có thể bị preempt ở bất kỳ ranh giới bytecode nào hay không
Hay là phải dùng nhiều lock hơn và cách viết cũng thay đổi theo
Free-threaded Python vẫn giữ hầu hết các bảo đảm như cũ
Có thể tận dụng đa lõi, nhưng hiệu năng trên mỗi thread giảm và thư viện cần được làm lại
Race condition có thể xảy ra thường xuyên hơn, nên cần cẩn thận hơn khi viết Python đa luồng để đảm bảo độ tin cậy
Có tin Microsoft đã giải tán đội Faster Python
Vì không đạt dự báo kết quả kinh doanh năm 2025 nên đội không được duy trì
Sẽ theo dõi xem sau này CPython còn được bổ sung cải thiện hiệu năng nữa hay không, hoặc có công ty khác tài trợ hay không
Có vẻ Facebook (Meta) vẫn còn tài trợ một phần
Có nhắc đến việc tiến độ đã chậm rất nhiều so với cam kết của Microsoft
Dù kết quả này đáng tiếc, nhưng cũng nhắc rằng dự đoán của bản thân về việc không tin vào cam kết dài hạn của Microsoft đã đúng
Có tin đồn gần đây Google cũng dường như đã sa thải toàn bộ đội phát triển Python
Rất đáng tiếc, nhưng sắc thái là sau embrace & extend thì chỉ còn lại một bước cuối
Tò mò liệu có phải chỉ mình họ lo lắng về việc GIL biến mất khỏi Python hay không
Với bất kỳ ngôn ngữ nào, mã đa luồng phức tạp đều khó đáng tin cậy, và Python với tính động của nó còn khiến người ta thấy bất an hơn
Không phải chỉ một mình lo sợ trước thay đổi, dù cơ sở cho nỗi lo có thể là phi lý
Bản thân đang tích cực dùng asyncio
Dự đoán trong lĩnh vực như ML/AI sẽ là cấu trúc mà chuyên gia làm trước các thư viện phức tạp rồi chuyển giao cho người dùng phổ thông
Có thể là đang gieo lo lắng không cần thiết, nhưng cũng nhắc lại rằng LLM đã được huấn luyện trên mã Python của vài chục năm qua dưới giả định GIL tồn tại
Có hay không có GIL chỉ liên quan đến những ai muốn chạy công việc đa lõi
Thường xuyên dùng Python nhưng không phải chuyên gia, thỉnh thoảng chỉ chạy đồng thời vài hàm đơn giản bằng concurrent.futures
Tò mò kiểu người dùng này về sau cần thay đổi điều gì
Thread không còn bị trói bởi GIL nên nhìn chung sẽ nhanh hơn
Chia sẻ cảm nhận từ 20 năm làm lập trình chuyên nghiệp với Python
Khi thật sự cần thread thì thường chỉ giới hạn ở các trường hợp không thể tránh message passing
Cũng đã dùng Python lâu gần như vậy và đồng ý, nhưng diễn đạt hơi khác
Dù là ảnh AI, nhưng thấy lạ vì con rắn lại được vẽ với hai cái đuôi
Có ý kiến phụ họa là cứ lặng lẽ bỏ qua; đùa rằng hễ bài về Python mà chèn hình con rắn thì thường đó là tín hiệu không đáng để bận tâm lắm
Đề xuất tên đùa là
ConfusoborusChỉ ra rằng con rắn trong ảnh header trông như có hai cái đuôi
Ngoài hỗ trợ thư viện ra, tò mò liệu có ràng buộc nào khác khi chạy WSGI và worker Celery trong một process đơn hay không
Cho rằng đây là một công việc nền tảng cực lớn cho kỷ nguyên hiệu năng sắp tới