我知道類變數初始化發生在匯入時。如果是這種情況,在下面的代碼中,類的類變數初始化是否會A導致競爭條件?
a.py:
class A:
# Static code here...
pass
b.py:
class B:
def func(self):
from a import A
c.py:
import threading
from b import B
b1 = B()
b2 = B()
t1 = threading.Thread(target=b1.func)
t2 = threading.Thread(target=b2.func)
t1.start()
t2.start()
t1.join()
t2.join()
終端:
$ python c.py
uj5u.com熱心網友回復:
在 importlib 的 Cpython 實作中,C 端有一個執行緒鎖,但為了確定,我運行了以下腳本:
匯入檔案:
import time
print('importing, in imported file')
time.sleep(2) # drop the GIL
print('finished importing, in imported file')
匯入檔案:
import threading
def import_other_file():
print('going to import')
import ex12
print('finished importing')
t1 = threading.Thread(target=import_other_file)
t2 = threading.Thread(target=import_other_file)
t1.start()
t2.start()
t1.join()
t2.join()
輸出:
going to import
going to import
importing, in imported file
finished importing, in imported file
finished importing
finished importing
A類的類變數初始化會導致競爭條件嗎?
所以NO,由于 C 端的鎖定,不會有競爭條件。
uj5u.com熱心網友回復:
由于Global Interpreter Lock,我相信這里沒有資料競爭(假設您使用的是 CPython 或類似的實作)。在任何給定時間,只有一個執行緒可以執行 Python 位元組碼。
但是,不能(或至少不應該)依賴這兩個執行緒中的哪一個實際上首先匯入。A
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/418245.html
標籤:
