我正在使用 Python 執行緒同時做一些作業。我讓主執行緒執行task_A,并創建一個執行緒同時執行task_B。以下是我正在處理的代碼的簡化版本:
import threading
import numpy as np
def task_B(inc):
for elem in array:
value = elem inc
if __name__ == '__main__':
array = np.random.rand(10)
t1 = threading.Thread(target=task_B, args=(1))
t1.start()
# task_A
array_copy = list()
for elem in array:
array_copy.append(elem)
t1.join()
我知道上面的代碼沒有做任何有意義的事情。請把它當作一個簡化的例子。如您所見,變數array在主執行緒和新創建的執行緒中都是只讀的t1。因此,不需要鎖定array主執行緒和t1執行緒,因為它們都不會修改(或寫入)變數。但是,當我對代碼進行計時時,Python 執行緒似乎會自動鎖定執行緒之間共享的變數,即使它們是只讀的。有沒有辦法讓每個執行緒同時運行而不鎖定只讀變數?我找到了這段代碼,但無法弄清楚如何將其應用于我的情況。
uj5u.com熱心網友回復:
你說得對,在這種情況下“不需要鎖”,但是 CPython 解釋器(我猜你用它來運行你的 Python 代碼)并不那么聰明。
Python 代碼總是在持有 GIL 的情況下執行,因此兩個執行緒彼此排他地執行(而不是同時執行),盡管是以交錯的方式(如果沒有執行緒則不會出現這種情況,執行將是純順序的)。
這就是為什么性能關鍵代碼經常被卸載到其他 *行程(使用multiprocessing庫)或用Cython撰寫的原因(這里是一個解決與您類似的問題的示例)。
有關 GIL 為何存在的更多詳細資訊,請參閱該問題:有沒有辦法使用純 python 為純函式釋放 GIL?.
有希望在未來(2022 年以上)Gil 可能會放松,但現在你被它困住了,所以要解決它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/409609.html
標籤:
