PythonGIL 中的自由線程模式已停用)

Mary-Kate Olsen
發布: 2024-10-11 10:17:02
原創
1047 人瀏覽過

Python 3.13 最近剛發布,具有一個令人驚嘆的新功能,稱為「自由執行緒模式」。當您使用線程時,這對於程式碼的效能來說是一個很大的改進。本文展示如何啟用此功能(預設不啟用)並展示「自由執行緒模式」對程式碼效能的影響。

安裝免費線程Python

Windows 和 MacOS 用戶

對於 Windows 和 MacOS 用戶,只需從 Python 網站下載最新的安裝程式即可。當您安裝Python時,當您選擇「自訂安裝」選項時,會有一個啟用「自由執行緒模式」的複選框。

Free Threaded Mode in PythonGIL disabled)

Ubuntu 用戶

對於 Ubuntu 用戶,您可以透過在終端機中執行以下命令來啟用此功能:

sudo add-apt-repository ppa:deadsnakes
sudo apt-get update
sudo apt-get install python3.13-nogil
登入後複製

驗證自由線程模式已啟用

安裝套件後,您可以使用 python3.13(原始)和 python3.13-nogil 或 python3.13t(免費線程 Python)運行程式碼。

請參閱這篇文章,以了解有關如何在 Linux 發行版上安裝 Python 3.13 實驗版的更多詳細資訊。

要驗證您的 Python 是否啟用了“自由執行緒模式”,您可以使用以下命令:

python3.13t -VV
Python 3.13.0 experimental free-threading build (main, Oct  8 2024, 08:51:28) [GCC 11.4.0]
登入後複製

自由線程模式效能

實驗設定

讓我們看看自由執行緒模式對下面簡單程式碼的影響:

  • 我有一個函數工作者,它執行一些計算並傳回 0 到 1000 萬之間的數字總和。
  • 我有「測試 1」來按順序運行工作函數 5 次。
  • 我有「測試 2」來使用多個執行緒並行運行工作函數,執行緒數為 5。
  • 我確實測量了這兩個測試的執行時間。
import sys
import threading
import time

print("Python version : ", sys.version)

def worker():
    sum = 0
    for i in range(10000000):
        sum += i


n_worker = 5
# Single thread

start = time.perf_counter()
for i in range(n_worker):
    worker()
print("Single Thread: ", time.perf_counter() - start, "seconds")


# Multi thread
start = time.perf_counter()
threads = []
for i in range(n_worker):
    t = threading.Thread(target=worker)

    threads.append(t)
    t.start()

for t in threads:
    t.join()
print("Multi Thread: ", time.perf_counter() - start, "seconds")

登入後複製

稍後,我將使用普通 Python(python3.13 二進位檔案)和免費線程 Python(pypy3.13t 二進位檔案)運行此程式碼。

結果

首先,使用python3.13運行測試:

python3.13 gil_test.py 
Python version :  3.13.0 (main, Oct  8 2024, 08:51:28) [GCC 11.4.0]
Single Thread:  1.4370562601834536 seconds
Multi Thread:  1.3681392602156848 seconds
登入後複製

然後,使用 pypy3.13t 執行測試:

python3.13t gil_test.py 
Python version :  3.13.0 experimental free-threading build (main, Oct  8 2024, 08:51:28) [GCC 11.4.0]
Single Thread:  1.862126287072897 seconds
Multi Thread:  0.3931183419190347 seconds
登入後複製

我也嘗試使用 python3.11:

python3.11 gil_test.py 
Python version :  3.11.3 (main, Apr 25 2023, 16:40:23) [GCC 11.3.0]
Single Thread:  1.753435204969719 seconds
Multi Thread:  1.457715731114149 seconds
登入後複製

結果分析

Python預設有GIL(Global Interpreter Lock)鎖定機制,使得多執行緒其實並不是並行的。可以看到單線程的時間處理和多線程類似。

使用python3.11t(自由執行緒模式),多執行緒效能比單執行緒快很多。所以,多執行緒現在實際上是並行的。

但是,你有沒有發現 python3.13t 中的單執行緒測驗比 pypy3.13 慢一點?

我不太明白為什麼,所以如果你有任何解釋請告訴我。

結論

我認為在python中使用多執行緒進行並行處理是很好的。但是,如果沒有GIL鎖定機制,則需要開發人員注意“線程安全”,即。在執行緒之間共享資料。

此外,我們需要等待函式庫和套件更新才能完全支援自由執行緒模式。這就是為什麼現在預設不啟用“自由線程模式”的原因之一。但是,我認為這將是未來的一個很好的功能。

以上是PythonGIL 中的自由線程模式已停用)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板