<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ting Zhang</title>
    <description>The latest articles on DEV Community by Ting Zhang (@ting_zhang_faccffc6648964).</description>
    <link>https://dev.to/ting_zhang_faccffc6648964</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3794009%2F7cf40a48-878e-4d69-b6ce-1989ae620c9b.png</url>
      <title>DEV Community: Ting Zhang</title>
      <link>https://dev.to/ting_zhang_faccffc6648964</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ting_zhang_faccffc6648964"/>
    <language>en</language>
    <item>
      <title>Python GIL 介紹</title>
      <dc:creator>Ting Zhang</dc:creator>
      <pubDate>Fri, 27 Feb 2026 14:27:36 +0000</pubDate>
      <link>https://dev.to/ting_zhang_faccffc6648964/python-gil-jie-shao-1hcc</link>
      <guid>https://dev.to/ting_zhang_faccffc6648964/python-gil-jie-shao-1hcc</guid>
      <description>&lt;h2&gt;
  
  
  什麼是 GIL？
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 GIL 是 CPython 解釋器中的一個鎖，確保在任何時刻只有一個線程可以執行 Python 字節碼。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;這意味著即使有多個線程，Python 程式也無法真正利用多核心 CPU 實現並行（parallelism），僅能實現並發（concurrency）的假象。GIL 為 Python 提供了以下好處：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;簡化種族條件（Race Conditions）&lt;/strong&gt;：防止Multi thread同時修改共享資料，降低記憶體損壞風險。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;簡化垃圾回收（Garbage Collection）&lt;/strong&gt;：GIL 使記憶體管理更簡單，無需複雜的鎖機制。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;歷史背景&lt;/strong&gt;：Python 於 1991 年設計時，多數電腦僅有單核心 CPU，GIL 是當時簡化實現的合理選擇。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;然而，GIL 的缺點顯而易見：它限制了多核心 CPU 的利用率，使 Python 在 CPU 密集型任務（如數學計算、資料解析、AI 模型訓練）上的效能不如預期。&lt;/p&gt;

&lt;h2&gt;
  
  
  為什麼移除 GIL？（PEP 703, Python 3.13）
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 隨著硬體技術的進步（多核心 CPU 普及）和 Python 社群對高效能的需求，GIL 逐漸成為瓶頸。PEP 703（Python 3.13）提出使 GIL 可選，允許程式在編譯時或運行時禁用 GIL，讓Multi thread直接利用操作系統的線程調度器，實現真正的並行。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  移除 GIL 的動機
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;社群需求&lt;/strong&gt;：開發者希望 Python 能更快，並充分利用現代多核心硬體。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;效能提升&lt;/strong&gt;：禁用 GIL 後，某些 CPU 密集型任務（如桶排序、分形生成）可顯著加速。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;競爭壓力&lt;/strong&gt;：其他語言（如 Go、Rust）支援真正的並行，Python 需跟上時代。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  移除 GIL 的挑戰
&lt;/h3&gt;

&lt;p&gt;移除 GIL 並非易事，因為 Python 的許多核心機制依賴 GIL 的保護。以下是主要挑戰：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;引用計數（Reference Counting）&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;問題&lt;/strong&gt;：傳統的非原子引用計數（non-atomic reference counting）不具線程安全，可能導致種族條件。例如，refcount++ 分三步（讀、加、寫），可能被其他線程中斷。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;解決方案&lt;/strong&gt;：

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;原子引用計數&lt;/strong&gt;：線程安全，但速度慢 10x-100x。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;偏向引用計數（Biased Reference Counting）&lt;/strong&gt;：檢查引用是否僅屬於單一線程，若是則使用快速的非原子計數，否則使用原子計數。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;垃圾回收（Garbage Collection）&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;問題&lt;/strong&gt;：傳統垃圾回收依賴 GIL 保護，需改用延遲引用計數（deferred reference counting）來處理循環引用。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;記憶體分配&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;問題&lt;/strong&gt;：現有記憶體分配器假設 GIL 保護，不具線程安全。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;解決方案&lt;/strong&gt;：開發新的線程安全記憶體分配器，優化列表和字典的快速讀取。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;兼容性&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;問題&lt;/strong&gt;：許多 C-API 擴展（如 NumPy、Pandas）假設 GIL 存在，需重新編譯以支援無 GIL 環境。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  GIL 與禁用 GIL 的比較
&lt;/h2&gt;

&lt;p&gt;以下表格比較了 GIL 和禁用 GIL 的特點：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;特性&lt;/th&gt;
&lt;th&gt;啟用 GIL&lt;/th&gt;
&lt;th&gt;禁用 GIL&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;並行性&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;非真正的並行，僅一個線程執行&lt;/td&gt;
&lt;td&gt;真正的Multi thread並行，利用多核心&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;資料共享&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;簡單，無需額外鎖&lt;/td&gt;
&lt;td&gt;需小心處理種族條件（如使用 threading.Lock）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;效能&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;受限於 GIL，CPU 綁定任務慢&lt;/td&gt;
&lt;td&gt;視程式而定，可能顯著提升（如桶排序、分形生成）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;擴展相容性&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;廣泛支援&lt;/td&gt;
&lt;td&gt;需檢查擴展版本（如 Cython、NumPy）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  禁用 GIL 的推薦場景
&lt;/h2&gt;

&lt;p&gt;禁用 GIL 在以下場景中特別有用：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ETL 處理&lt;/strong&gt;：資料提取、轉換和載入需要大量計算。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;圖像處理&lt;/strong&gt;：如濾波、轉換等 CPU 密集型操作。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;日誌分析&lt;/strong&gt;：處理大量資料並進行模式匹配。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;即時分析&lt;/strong&gt;：需要快速響應的計算任務。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  注意事項
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Race Condition&lt;/strong&gt;：禁用 GIL 後，Multi thread可能同時存取共享資料，導致記憶體損壞。建議使用 threading.Lock 或其他同步機制。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;擴展模組相容性&lt;/strong&gt;：確認使用的庫（如 NumPy、Pandas、PyTorch）支援無 GIL 環境。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;效能不確定性&lt;/strong&gt;：禁用 GIL 不保證所有程式都變快，需針對具體任務進行基準測試。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  常見誤解與解答
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;並發(Concurrency)與並行(Parallelism)的區別&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;並發是多任務「看似」同時進行，實際上可能是切換執行。&lt;/li&gt;
&lt;li&gt;並行是多任務在多核心上真正同時執行。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;為什麼 Python 慢？&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GIL 限制了Multi thread的並行性，導致 CPU 綁定任務無法充分利用多核心。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;禁用 GIL 如何管理 CPU 使用？&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;透過操作系統的線程調度器，讓Multi thread在多核心上並行執行。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;禁用 GIL 是否總是更快？&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;不一定，效能提升取決於任務類型和程式設計。某些任務（如 I/O 綁定）可能無明顯改善。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;簡單資料共享是什麼？&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;指線程間直接存取記憶體的能力，而Multi process需要管道或共享記憶體，較為複雜。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  參考資料
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://peps.python.org/pep-0703/" rel="noopener noreferrer"&gt;PEP 703 – Making the Global Interpreter Lock Optional in CPython&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tw.pycon.org/2025/zh-hant/conference/keynotes#Donghee_Na" rel="noopener noreferrer"&gt;PyCon TW 2025 主題演講&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tw.pycon.org/2025/zh-hant/conference/talk/352" rel="noopener noreferrer"&gt;PyCon TW 2025 - Talk 352&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tw.pycon.org/2025/zh-hant/conference/talk/335" rel="noopener noreferrer"&gt;PyCon TW 2025 - Talk 335&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>python</category>
      <category>gil</category>
      <category>threading</category>
      <category>concurrency</category>
    </item>
  </channel>
</rss>
