自由執行緒 Python:移除 GIL 的過去、現在與未來
LWN.net · 2026-06-25
CPython 核心開發者 Thomas Wouters 於 2026 年 6 月公開分享了自由執行緒(free-threaded)Python 的完整演進路線圖,說明從 1996 年 Greg Stein 的早期嘗試,到 Meta 工程師 Sam Gross 在 2021 年以 PEP 703 實現突破的歷程。Python 3.14(2025 年 10 月)已移除實驗性標籤,目前單執行緒效能損耗降至 0–10%。
背景
全域直譯器鎖(GIL)長期限制 CPython 無法真正平行化多執行緒運算。早期移除 GIL 的嘗試均以單執行緒效能大幅下滑告終:Stein 的方案造成不可接受的效能損失,Hastings 的 Gilectomy 計畫亦無疾而終。Sam Gross 在 Meta 的研究突破了這一困境,其成果經 PEP 703 於 2023 年 10 月被指導委員會接受。
核心改動
自由執行緒模式採用三項關鍵技術取代 GIL 保護:偏向式參考計數(Biased Reference Counting)讓物件追蹤擁有者執行緒,該執行緒使用非原子操作以維持快速路徑;延遲參考計數(Deferred Reference Counting)將部分操作推遲至垃圾回收;記憶體配置器由 pymalloc 換成執行緒安全的 mimalloc。此外引入「Python Critical Sections」巨集,以無死鎖方式保護可變容器(list、dict、set)。
Python 3.15(預計 2026 年 10 月)將統一 GIL 與自由執行緒的 ABI,擴充套件開發者只需編譯一次即可同時支援兩種模式。PyPI 前 360 大二進位套件中已有超過 50% 支援自由執行緒。
影響範圍
目前載入不支援自由執行緒的擴充套件時,直譯器會自動重新啟用 GIL 並發出警告。Wouters 預測自由執行緒版本將在 Python 3.16(2027 年)至 3.20(2031 年)間成為預設值,傳統 GIL 版本將在未來十年內逐步淘汰。C 擴充套件移植的主要工作是保護原本由 GIL 防護的全域變數,並補充多執行緒測試。
原始來源:PEP 703 – Making the Global Interpreter Lock Optional in CPython
Linux 核心 7.2-rc1 發布:合併視窗關閉,進度平穩
LWN.net · 2026-06-28
Linus Torvalds 於 2026 年 6 月 28 日宣布 Linux 7.2-rc1 發布,兩週合併視窗以「相當正常」的節奏收尾。Torvalds 表示期間曾短暫休假,但持續透過電子郵件監控進度,整體開發步調符合預期。
核心改動
此版本跨越多個子系統,涵蓋 VFS、排程器、記憶體管理的基礎設施更新,以及 x86、ARM64、s390、LoongArch、RISC-V 等多架構的支援改進。GPU 驅動程式佔變更量最大比例,主要來自 AMD 暫存器定義標頭的大量匯入(AMD header drop)。網路、儲存(SCSI、NFS、SMB)、USB/Thunderbolt 驅動程式亦有更新。
核心子系統方面,BPF、io_uring、KVM 虛擬化及加密實作均收到顯著貢獻,由 Andrew Morton 與 Christian Brauner 負責整合核心基礎設施部分。
影響範圍
驅動程式變更(排除 AMD 標頭)佔整體修補超過一半,其餘分佈於架構程式碼、文件與工具鏈。超過 100 位維護者參與本輪合併,顯示 7.2 正式版的開發速度穩定。rc 測試階段預計持續數週後發布最終版本。
Cloudflare 發現並回報 Rust HTTP 函式庫 hyper 的資料截斷漏洞
Cloudflare · 2026-06-22
Cloudflare 工程團隊在 2025 年 12 月重構 Images binding 架構後,陸續收到大型圖片回應不完整的問題回報:一個 14.9 MB 的回應實際只送出約 219 KB,HTTP 狀態碼卻顯示 200 OK。調查後確認根源在 hyper Rust HTTP 函式庫的 HTTP/1 連線狀態機,已於 2026 年 6 月 11 日透過 PR #4018 修復。
漏洞機制
問題位於 dispatch.rs 的連線迴圈中,poll_flush 的回傳值以 let _ 直接丟棄,導致忽略 Poll::Pending 訊號(代表緩衝區尚未完全寫入)。當 socket 緩衝區填滿時,迴圈仍會檢查 wants_read_again() 並取得 false,進而觸發連線關閉,此時 hyper 內部緩衝區仍有大量未傳送資料。
// 有問題的原始碼
let _ = self.poll_flush(cx)?;
// 修復後的 poll_shutdown
pub(crate) fn poll_shutdown(&mut self, cx: &mut Context<'_>) -> Poll<io::Result<()>> {
ready!(self.poll_flush(cx)?);
Pin::new(&mut self.io).poll_shutdown(cx)
}修復策略選擇在 shutdown 入口點強制完成 flush,而非修改脆弱的 poll 迴圈本身,以避免引入 CPU 忙轉(busy-loop)風險。
受影響版本
該漏洞橫跨多個主要版本,包含 0.14.x、1.7 及 1.8。觸發條件為回應端讀取速度偶爾跟不上寫入速度,在使用 Unix socket 或高延遲消費者時更容易出現。目前無已知 CVE 編號。
修補與緩解
修補程式已於 2026 年 6 月 11 日由維護者 seanmonstar 合併(commit f41c288),升級至包含 PR #4018 的版本即可修復。Cloudflare 主動將問題回報給上游並提交修補程式,維護者亦表示後續將進行更完整的狀態機重構。