介紹
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 <h2> 分析: </h2> <pre class="brush:php;toolbar:false">## 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 <p><strong>多執行緒效能:</strong>停用 GIL 的真正好處在多執行緒場景中是顯而易見的:</p> <p>停用 GIL (3.13) 時,執行時間為 1.5703 秒。 <br> 啟用 GIL 後(3.13),執行時間為 8.5901 秒。 <br> 結果:禁用 GIL 使多執行緒任務的效能提高了約 81.7%。 </p> <p><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/173615392355601.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="Python The Gateway to High-Performance Multithreading Without GIL"></p> <p><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/173615392486147.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="Python The Gateway to High-Performance Multithreading Without GIL"></p> <p>該圖表清楚地表明,在 Python 3.13 中禁用 GIL 可以顯著提升多執行緒 CPU 密集型任務的效能,從而使 Python 能夠高效地並行利用多個 CPU 核心。雖然單執行緒和多處理效能基本上不受影響,但多執行緒效能顯示出顯著改進,使 Python 3.13 成為依賴多執行緒的 CPU 密集型應用程式的遊戲規則改變者。 </p><p>但是,3.13之前的Python版本不支援停用GIL,這也解釋了為什麼它們的多執行緒效能仍然與啟用GIL的Python 3.13相似。早期版本中的這項限制繼續限制 Python 充分利用多執行緒處理 CPU 密集型任務的能力。 </p> <h2> 禁用 GIL 之前的主要注意事項 </h2> <p>在 Python 3.13 中停用全域解釋器鎖定 (GIL) 可以顯著提高多執行緒 CPU 密集型任務的效能。但是,在此之前需要考慮幾個重要因素:</p>
執行緒安全:如果沒有 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中文網其他相關文章!

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

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

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

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

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

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

如何在10小時內教計算機小白編程基礎?如果你只有10個小時來教計算機小白一些編程知識,你會選擇教些什麼�...

使用FiddlerEverywhere進行中間人讀取時如何避免被檢測到當你使用FiddlerEverywhere...


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

Atom編輯器mac版下載
最受歡迎的的開源編輯器

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

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