Lộ Trình Python 2026: Lazy Imports, Rust Trong CPython, D-Strings và Hồi Kết Của GIL

Lộ Trình Python 2026: Lazy Imports, Rust Trong CPython, D-Strings và Hồi Kết Của GIL

Python 3.15 mang đến lazy imports và free-threading chính thức. Rust sẽ có mặt trong CPython 3.16. D-strings thay thế textwrap.dedent(). Calendar versioning bị reject. Tổng hợp mọi thứ sắp đến với Python năm 2026.


Mục lục

Nếu bạn nghĩ Python 3.14 đã là bước ngoặt lớn, thì 2026 còn ấn tượng hơn nữa. Lazy imports chính thức xuất hiện, Rust bắt đầu đi vào CPython, GIL trở thành tùy chọn, và một string prefix mới khiến textwrap.dedent() trở nên lỗi thời.

Đây không phải danh sách mong muốn. Đây là các PEP đã được chấp nhận, đang triển khai, và nằm trong roadmap chính thức. Cùng xem chi tiết.


Lazy imports: tính năng hiệu suất mà Python luôn cần (PEP 810)

Trạng thái: Đã chấp nhận, có sẵn trong Python 3.15.0a7

Đây là tính năng chủ đạo của Python 3.15. Sau nhiều năm tranh luận (và PEP 690 bị reject), Steering Council đã chấp nhận PEP 810 — explicit lazy imports.

Vấn đề ai cũng biết: Python load tất cả module ngay lúc import. Một Django management command import nửa framework chỉ để in help message — tốn hàng trăm millisecond trước khi code của bạn chạy dòng nào.

Giải pháp rất đẹp:

lazy import numpy as np
lazy from pandas import DataFrame

# numpy và pandas CHƯA load — chỉ load khi thực sự dùng
df = DataFrame({"a": [1, 2, 3]})  # pandas load TẠI ĐÂY

Tại sao quan trọng với production

Đội CPython phát hiện 17% imports trong standard library đã được đặt bên trong hàm để trì hoãn loading. Đó là developer tự workaround một hạn chế của ngôn ngữ. lazy import biến tối ưu này thành explicit, sạch sẽ và dễ bảo trì.

Tác động thực tế:

  • CLI tools — Click-based CLIs và Django management commands khởi động nhanh hơn đáng kể
  • Microservices — Cold start giảm khi các import không dùng tới không bị load
  • Type checking — Không cần if TYPE_CHECKING: nữa cho các import nặng
  • Large codebases — Ứng dụng enterprise với dependency tree sâu hưởng lợi nhiều nhất

Còn side effects thì sao?

Quyết định thiết kế quan trọng: lazy chỉ áp dụng cho module an toàn để trì hoãn. Nếu module có side effects khi import (như đăng ký signal handler), bạn import bình thường. Keyword này là opt-in từng câu import — không có global switch, không bất ngờ.

import logging          # Bình thường — có side effects (cấu hình root logger)
lazy import numpy as np  # Lazy — thư viện thuần, an toàn để trì hoãn

Free-threading chính thức: GIL giờ là tùy chọn

Trạng thái: Chính thức từ Python 3.14+, đang hoàn thiện trong 3.15

Python 3.13 giới thiệu free-threading ở mức thử nghiệm. Python 3.14 nâng cấp lên. Giờ trong 3.15, bản build --disable-gil đã đủ ổn định cho production, và hệ sinh thái đang bắt kịp.

Có gì mới trong 2026:

  • PEP 803 đề xuất abi3t, ABI variant ổn định cho bản build free-threaded. Extension authors có thể ship một wheel duy nhất cho cả Python có GIL và không GIL — không cần nhân đôi build matrix.
  • Các thư viện lớn (NumPy, pandas, scikit-learn) đã ship free-threaded wheels
  • Khoảng cách hiệu suất giữa bản GIL và no-GIL đã thu hẹp xuống vài phần trăm cho single-threaded code
# Python 3.15 với free-threading
import concurrent.futures
import hashlib

def compute_hash(data: bytes) -> str:
    return hashlib.sha256(data).hexdigest()

# Giờ THỰC SỰ chạy song song — không còn GIL chặn
with concurrent.futures.ThreadPoolExecutor(max_workers=8) as executor:
    results = list(executor.map(compute_hash, large_dataset))

Với CPU-bound work trước đây phải dùng multiprocessing (cùng toàn bộ overhead serialization), threads giờ hoạt động đúng nghĩa.


D-strings: textwrap.dedent() đã lỗi thời (PEP 822)

Trạng thái: Draft, nhắm Python 3.15

Mọi Python developer đều từng viết thế này:

import textwrap

def get_query():
    return textwrap.dedent("""\
        SELECT *
        FROM users
        WHERE active = true
        ORDER BY created_at DESC
    """)

PEP 822 giới thiệu prefix d tự động xử lý indentation:

def get_query():
    return d"""
        SELECT *
        FROM users
        WHERE active = true
        ORDER BY created_at DESC
    """

Prefix d dùng cùng thuật toán với textwrap.dedent() nhưng xử lý tại compile time. Nó kết hợp được với các prefix khác: df"..." cho dedented f-strings, dr"..." cho dedented raw strings, thậm chí dt"..." cho template strings mới từ Python 3.14.

Đây là cải tiến nhỏ về quality-of-life, nhưng loại bỏ một trong những “vết cắt giấy” liên tục khiến code Python xấu hơn mức cần thiết.


Rust đang đến với CPython — nhắm 3.16

Trạng thái: Đang phát triển, PEP dự kiến tháng 7/2026

Đây là thay đổi kiến trúc lớn. Nhóm “Rust for CPython” công bố vào tháng 4/2026 rằng code Rust sẽ có mặt trong CPython 3.16 (tháng 10/2027).

Lộ trình

  • Tháng 3/2026 — Hoàn thành build system — CI xanh trên mọi nền tảng
  • Tháng 4/2026 — Bắt đầu thiết kế Rust API nội bộ, chọn extension module đầu tiên
  • Tháng 5/2026 — Hoàn thiện thiết kế API, sprint tại PyCon US
  • Tháng 6/2026 — Bắt đầu viết PEP
  • Tháng 7/2026 — Nộp PEP và thảo luận
  • Tháng 5/2027 — Python 3.16 beta 1

Cách tiếp cận thận trọng và có chủ đích:

  1. Bắt đầu với một extension module duy nhất được reimplemented bằng Rust
  2. Rust API giữ ở mức nội bộ cho đến khi PEP sau stabilize nó
  3. Đội Rust đang tích cực hợp tác với maintainers CPython

Ý nghĩa

Rust trong CPython không phải viết lại Python bằng Rust. Mà là thay thế code C ở phần quan trọng về hiệu suất bằng Rust an toàn về bộ nhớ, vẫn giữ nguyên Python API. Nghĩ tới: parsing, hashing, serialization — những phần mà bug C trở thành CVE.

Với người dùng Python, không thay đổi gì. Code của bạn vẫn là Python. Nhưng interpreter bên dưới an toàn hơn và có thể nhanh hơn.


Bản vá bảo mật: cập nhật Python cũ ngay

Ba bản bảo mật phát hành tháng 3/2026:

  • Python 3.12.13 — Chỉ bảo mật (build từ source)
  • Python 3.11.15 — Chỉ bảo mật
  • Python 3.10.20 — Chỉ bảo mật

Các CVE quan trọng được vá:

  • CVE-2026-24515CVE-2026-25210 — Lỗ hổng XML parsing qua libexpat (nâng lên 2.7.4)
  • Bug XML memory amplification
  • Chặn control characters trong HTTP headers và URL parsing

Nếu bạn đang chạy 3.12 hoặc cũ hơn trên production, hãy vá ngay.


Các PEP đáng theo dõi khác

PEP 806: trộn sync/async context managers

Hiện tại, trộn withasync with cần lồng nhau:

# Cầu thang doom
async with resource_a() as a:
    with resource_b() as b:
        async with resource_c() as c:
            # cuối cùng, code thật sự

PEP 806 sẽ cho phép:

async with resource_a() as a, resource_b() as b, resource_c() as c:
    # sạch và phẳng

PEP 820: thiết kế lại C API slot

PySlot tagged union hiện đại hóa C extension API. C API Working Group bỏ phiếu 4-0 đề xuất chấp nhận. Quan trọng với extension authors và embedding scenarios.

Calendar versioning (PEP 2026) — bị reject

Đề xuất đổi tên Python 3.15 thành “Python 3.26” (dùng năm phát hành) đã bị reject bởi Steering Council. Python giữ nguyên đánh số phiên bản tuần tự. Vẫn là 3.15, không phải 3.26.


Bức tranh tổng thể: Python năm 2026

Điều nổi bật khi nhìn tất cả thay đổi này cùng lúc:

Python đang giải quyết các điểm yếu lịch sử. GIL là phàn nàn số 1 từ lập trình viên hệ thống — giờ nó trở thành tùy chọn. Hiệu suất import là nút thắt cổ chai — lazy imports sửa nó. Lỗi bảo mật bộ nhớ C tạo ra CVE — Rust xử lý tận gốc.

Tốc độ phát triển đang tăng. Chu kỳ phát hành hàng năm (PEP 602) giúp tính năng đến tay người dùng nhanh hơn. Python 3.14 cho chúng ta t-strings và free-threading. Python 3.15 cho lazy imports và d-strings. Python 3.16 sẽ mang Rust đến.

Ngôn ngữ đang trưởng thành, không trì trệ. Đây không phải syntax mới để cho vui. Chúng là giải pháp thực tiễn cho vấn đề thực mà lập trình viên Python production đối mặt hàng ngày.

Nếu bạn vẫn đang dùng Python 3.11 hay 3.12, khoảng cách đang ngày càng lớn. Đường upgrade từ 3.11 lên 3.15 không đau (mình đã viết hướng dẫn chi tiết từ 3.11 đến 3.14), và lợi ích — hiệu suất, bảo mật, trải nghiệm developer — tích lũy qua mỗi phiên bản.

2026 là năm Python ngừng xin lỗi về hạn chế của mình và bắt đầu sửa chúng.

Luồng

0
⌘/Ctrl+Enter để gửiGõ / để xem lệnh · Tab để @nhắc tên