首頁 後端開發 Python教學 Python 無需 GIL 即可實現高效能多執行緒的門戶

Python 無需 GIL 即可實現高效能多執行緒的門戶

Jan 06, 2025 pm 04:58 PM

介紹

Python 長期以來以其易用性和多功能性而聞名,但在 Python 社群中引發大量討論的一個主題是全域解釋器鎖定 (GIL)。 GIL 既是 Python 並發模型的保障,也是瓶頸,尤其是對於 CPU 密集型任務,否則這些任務可以利用多個 CPU 核心。然而,隨著 Python 3.13 的發布,Python 開發人員有了一個突破性的新選項:停用 GIL 的能力。本部落格將探討 GIL 是什麼、為什麼它成為多執行緒效能的障礙,以及如何在 Python 3.13 中偵測和停用 GIL 以釋放真正的多執行緒效能。

什麼是全域解釋器鎖(GIL)

全域解釋器鎖 (GIL) 是一個互斥鎖,用於保護對 Python 物件的訪問,防止多個本機執行緒同時執行 Python 字節碼。這保證了Python程式的執行緒安全,但代價是並發執行。 GIL 讓 Python 執行緒對於 I/O 密集型任務更加高效,但限制了它們對於 CPU 密集型任務的效能。

為什麼 GIL 是多執行緒的瓶頸

Python 的 GIL 只允許一個執行緒同時執行,即使在多執行緒程式中也是如此。雖然這對於程式等待輸入/輸出操作的 I/O 密集型任務來說很好,但它嚴重限制了 CPU 密集型任務(如數位運算、資料分析或影像處理)的效能。

Python 3.13:在禁用 GIL 的情況下解鎖多線程

使用 Python 3.13,開發人員可以選擇在 Python 建置過程中停用 GIL。但是,在預先建置的 Python 發行版中無法停用 GIL。相反,您必須使用 --disable-gil 選項從原始碼編譯 Python 3.13。

這個新選項為 CPU 密集型多執行緒任務中的真正並行性打開了大門,允許執行緒跨多個核心並行執行。

使用不含 GIL 的 Python 3.13 的先決條件

  • Python 3.13 原始碼: 標準預先建置二進位檔案中不支援停用 GIL。您必須使用 --disable-gil 標誌從原始碼建立 Python 3.13。
  • 多核心 CPU: 您需要多核心 CPU 才能從真正的多執行緒中受益,因為執行緒現在將跨多個核心並行運行。

在禁用 GIL 的情況下編譯 Python 3.13

要使用 -X gil=0 標誌停用 GIL,您需要在啟用 --disable-gil 標誌的情況下從原始碼編譯 Python。具體方法如下

一步一步

  • 下載Python 3.13原始碼 您首先需要從 Python 官方網站下載 Python 3.13 原始碼 tarball。這是因為預先建置的二進位(例如直接從 python.org 下載的二進位)未編譯為支援禁用 GIL。您可以使用網頁瀏覽器或使用 wget 甚至在終端機中使用 curl 下載它
wget https://www.python.org/ftp/python/3.13.0/Python-3.13.0.tgz
登入後複製
  • 擷取來源:
tar -xf Python-3.13.0.tgz
cd Python-3.13.0
登入後複製
  • 使用 --disable-gil 配置構建 您需要使用 --disable-gil 配置 Python 以支援停用 GIL 的選項。
./configure --disable-gil
登入後複製
  • 編譯並安裝Python:
make
sudo make altinstall 
登入後複製
  • 如果 altinstall 步驟失敗,則使用 --prefix 重新執行設定指令
./configure --disable-gil --prefix=$HOME/python3.13
登入後複製
  • 在指定目錄下執行make altinstall 然後,執行 make altinstall 命令
make altinstall
登入後複製

如何在 Python 3.13 中偵測 GIL

在Python 3.13中,您可以使用sys._is_gil_enabled()函數檢查GIL是否啟用或停用。

import sys

def check_gil_status():
    if sys.version_info >= (3, 13):
        status = sys._is_gil_enabled()
        if status:
            print("GIL is currently enabled.")
        else:
            print("GIL is currently disabled.")
    else:
        print("Python version does not support GIL status detection.")

check_gil_status()
登入後複製

實作:使用 GIL 的 Python 多執行緒與無 GIL 的比較

開發以下 Python 程式碼是為了評估 Python 3.13 中停用 GIL 時的效能增益。該腳本同時執行八個線程,每個線程的任務是計算大數的素因數。透過利用真正的並行性,程式碼突顯了無需 GIL 即可實現的增強效能。

#!/usr/bin/env python3
import sys
import sysconfig
import time
from threading import Thread
from multiprocessing import Process


# Decorator to measure execution time of functions
def calculate_execution_time(func):
    def wrapper(*args, **kwargs):
        start_time = time.perf_counter()
        result = func(*args, **kwargs)
        end_time = time.perf_counter()
        execution_time = end_time - start_time
        print(f"{func.__name__} took {execution_time:.4f} seconds.")
        return result

    return wrapper


# Compute-intensive task: Iterative Fibonacci calculation
def compute_fibonacci(n):
    """Compute Fibonacci number for a given n iteratively."""
    a, b = 0, 1
    for _ in range(n):
        a, b = b, a + b
    return a


# Single-threaded task execution
@calculate_execution_time
def run_single_threaded(nums):
    for num in nums:
        compute_fibonacci(num)


# Multi-threaded task execution
@calculate_execution_time
def run_multi_threaded(nums):
    threads = [Thread(target=compute_fibonacci, args=(num,)) for num in nums]
    for thread in threads:
        thread.start()
    for thread in threads:
        thread.join()


# Multi-processing task execution
@calculate_execution_time
def run_multi_processing(nums):
    processes = [Process(target=compute_fibonacci, args=(num,)) for num in nums]
    for process in processes:
        process.start()
    for process in processes:
        process.join()


# Main execution function
def main():
    # Check Python version and GIL status for Python 3.13+
    print(f"Python Version: {sys.version}")

    py_version = float(".".join(sys.version.split()[0].split(".")[:2]))
    status = sysconfig.get_config_var("Py_GIL_DISABLED")

    if py_version >= 3.13:
        status = sys._is_gil_enabled()

    if status is None:
        print("GIL cannot be disabled for Python <= 3.12")
    elif status == 0:
        print("GIL is currently disabled")
    elif status == 1:
        print("GIL is currently active")

    # Run tasks on the same input size for comparison
    nums = [300000] * 8

    print("\nRunning Single-Threaded Task:")
    run_single_threaded(nums)

    print("\nRunning Multi-Threaded Task:")
    run_multi_threaded(nums)

    print("\nRunning Multi-Processing Task:")
    run_multi_processing(nums)


if __name__ == "__main__":
    main()

登入後複製

分析:

## Python 3.13 with GIL Disabled
Python Version: 3.13.0 experimental free-threading build (main, Oct 14 2024, 17:09:28) [Clang 14.0.0 (clang-1400.0.29.202)]
GIL is currently disabled

Running Single-Threaded Task:
run_single_threaded took 8.6587 seconds.

Running Multi-Threaded Task:
run_multi_threaded took 1.3885 seconds.

Running Multi-Processing Task:
run_multi_processing took 1.5953 seconds.

## Python 3.13 with GIL Enabled
Python Version: 3.13.0 experimental free-threading build (main, Oct 14 2024, 17:09:28) [Clang 14.0.0 (clang-1400.0.29.202)]
GIL is currently active

Running Single-Threaded Task:
run_single_threaded took 8.7108 seconds.

Running Multi-Threaded Task:
run_multi_threaded took 8.6645 seconds.

Running Multi-Processing Task:
run_multi_processing took 1.4530 seconds.

## Python 3.12 
Python Version: 3.12.6 (main, Sep  7 2024, 19:30:10) [Clang 14.0.0 (clang-1400.0.29.202)]
GIL cannot be disabled for Python <= 3.12

Running Single-Threaded Task:
run_single_threaded took 8.7004 seconds.

Running Multi-Threaded Task:
run_multi_threaded took 8.6297 seconds.

Running Multi-Processing Task:
run_multi_processing took 1.4876 seconds.
登入後複製

多執行緒效能:停用 GIL 的真正好處在多執行緒場景中是顯而易見的:

停用 GIL (3.13) 時,執行時間為 1.5703 秒。
啟用 GIL 後(3.13),執行時間為 8.5901 秒。
結果:禁用 GIL 使多執行緒任務的效能提高了約 81.7%。

Python The Gateway to High-Performance Multithreading Without GIL

Python The Gateway to High-Performance Multithreading Without GIL

該圖表清楚地表明,在 Python 3.13 中禁用 GIL 可以顯著提升多執行緒 CPU 密集型任務的效能,從而使 Python 能夠高效地並行利用多個 CPU 核心。雖然單執行緒和多處理效能基本上不受影響,但多執行緒效能顯示出顯著改進,使 Python 3.13 成為依賴多執行緒的 CPU 密集型應用程式的遊戲規則改變者。

但是,3.13之前的Python版本不支援停用GIL,這也解釋了為什麼它們的多執行緒效能仍然與啟用GIL的Python 3.13相似。早期版本中的這項限制繼續限制 Python 充分利用多執行緒處理 CPU 密集型任務的能力。

禁用 GIL 之前的主要注意事項

在 Python 3.13 中停用全域解釋器鎖定 (GIL) 可以顯著提高多執行緒 CPU 密集型任務的效能。但是,在此之前需要考慮幾個重要因素:

  • 執行緒安全:如果沒有 GIL,您必須使用鎖定或其他同步機製手動處理執行緒安全,以防止程式碼中的競爭條件。

  • 潛在的效能下降:細粒度鎖定可能會引入爭用,這可能會降低先前受益於 GIL 的單執行緒或 I/O 密集型任務的效能。

  • 與第三方函式庫的相容性:許多 C 擴充功能和函式庫假設存在 GIL 以確保執行緒安全。停用 GIL 可能需要更新這些庫,以確保它們在多執行緒環境中正常運作。

  • 複雜的記憶體管理:停用 GIL 會增加記憶體管理的複雜性,需要執行緒安全的記憶體處理,這會增加錯誤和錯誤的風險。

  • I/O 密集型任務: 禁用GIL 為I/O 密集型任務帶來的好處有限,在這些任務中,像asyncio 這樣的非阻塞I/O 機制可能更有效。

  • 除錯困難:如果沒有 GIL,由於競爭條件和死鎖的可能性增加,調試多執行緒應用程式可能會變得更具挑戰性。

  • 更高的記憶體使用量: 在沒有 GIL 的情況下使用鎖定和管理執行緒狀態會增加記憶體消耗,特別是在多執行緒應用程式中。

  • 嵌入式系統:停用 GIL 可能會使 Python 與嵌入式系統中的多執行緒環境的整合變得複雜,需要付出更多努力才能有效整合。

  • 鎖定爭用:在某些情況下,停用 GIL 可能會導致執行緒之間出現鎖定爭用,這可能會降低預期的效能改進。

GitHub 儲存庫

您可以在我的 GitHub 上找到此部落格中範例的完整原始程式碼:

Python GIL 效能分析

免責聲明:

這是一個個人部落格。本文所表達的觀點和意見僅代表作者的觀點和意見,並不代表與作者相關的任何組織或個人的專業或個人觀點。

以上是Python 無需 GIL 即可實現高效能多執行緒的門戶的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1657
14
CakePHP 教程
1415
52
Laravel 教程
1309
25
PHP教程
1257
29
C# 教程
1229
24
Python vs.C:申請和用例 Python vs.C:申請和用例 Apr 12, 2025 am 12:01 AM

Python适合数据科学、Web开发和自动化任务,而C 适用于系统编程、游戏开发和嵌入式系统。Python以简洁和强大的生态系统著称,C 则以高性能和底层控制能力闻名。

Python:遊戲,Guis等 Python:遊戲,Guis等 Apr 13, 2025 am 12:14 AM

Python在遊戲和GUI開發中表現出色。 1)遊戲開發使用Pygame,提供繪圖、音頻等功能,適合創建2D遊戲。 2)GUI開發可選擇Tkinter或PyQt,Tkinter簡單易用,PyQt功能豐富,適合專業開發。

您可以在2小時內學到多少python? 您可以在2小時內學到多少python? Apr 09, 2025 pm 04:33 PM

兩小時內可以學到Python的基礎知識。 1.學習變量和數據類型,2.掌握控制結構如if語句和循環,3.了解函數的定義和使用。這些將幫助你開始編寫簡單的Python程序。

2小時的Python計劃:一種現實的方法 2小時的Python計劃:一種現實的方法 Apr 11, 2025 am 12:04 AM

2小時內可以學會Python的基本編程概念和技能。 1.學習變量和數據類型,2.掌握控制流(條件語句和循環),3.理解函數的定義和使用,4.通過簡單示例和代碼片段快速上手Python編程。

Python與C:學習曲線和易用性 Python與C:學習曲線和易用性 Apr 19, 2025 am 12:20 AM

Python更易學且易用,C 則更強大但複雜。 1.Python語法簡潔,適合初學者,動態類型和自動內存管理使其易用,但可能導致運行時錯誤。 2.C 提供低級控制和高級特性,適合高性能應用,但學習門檻高,需手動管理內存和類型安全。

Python和時間:充分利用您的學習時間 Python和時間:充分利用您的學習時間 Apr 14, 2025 am 12:02 AM

要在有限的時間內最大化學習Python的效率,可以使用Python的datetime、time和schedule模塊。 1.datetime模塊用於記錄和規劃學習時間。 2.time模塊幫助設置學習和休息時間。 3.schedule模塊自動化安排每週學習任務。

Python:探索其主要應用程序 Python:探索其主要應用程序 Apr 10, 2025 am 09:41 AM

Python在web開發、數據科學、機器學習、自動化和腳本編寫等領域有廣泛應用。 1)在web開發中,Django和Flask框架簡化了開發過程。 2)數據科學和機器學習領域,NumPy、Pandas、Scikit-learn和TensorFlow庫提供了強大支持。 3)自動化和腳本編寫方面,Python適用於自動化測試和系統管理等任務。

Python:自動化,腳本和任務管理 Python:自動化,腳本和任務管理 Apr 16, 2025 am 12:14 AM

Python在自動化、腳本編寫和任務管理中表現出色。 1)自動化:通過標準庫如os、shutil實現文件備份。 2)腳本編寫:使用psutil庫監控系統資源。 3)任務管理:利用schedule庫調度任務。 Python的易用性和豐富庫支持使其在這些領域中成為首選工具。

See all articles