[英]Python boolean thread safe
如果我在檢查其值之前不鎖定它,如果我使用布爾值來控制線程的循環,可能會發生什么。 可以引發異常嗎?
請注意,如果我的循環再次運行,這不是問題,但如果可能的話,我想避免鎖定資源的成本
# self is the same object in the 2 functions
def __init__(self):
self.status=True
# thread 1
def stop(self):
# Lock acquired to avoid concurrent writes
self.lock.acquire()
self.status=False
self.lock.release()
# thread 2
def thread_func(self):
while self.status:
# Do stuff
# Not important if it does a cycle more after status is set to false
無需鎖定。 Python 使用 GIL(全局解釋器鎖)來防止從不同線程同時訪問對象。
在 CPython 中,全局解釋器鎖或 GIL 是一個互斥鎖,用於保護對 Python 對象的訪問,防止多個線程同時執行 Python 字節碼。 GIL 可防止競爭條件並確保線程安全[https://wiki.python.org/moin/GlobalInterpreterLock]
當您想在涉及多個字節碼的某些操作期間阻止訪問某些對象時,應該使用鎖,例如,如果您有多個線程執行此操作:
x.data1 = 10
x.data2 = 20
x.process()
如果線程在第一行和第二行之間切換,您最終可能會使用混合數據調用x.process()
,或者x.process()
可能會使用相同的數據調用兩次。
在這種情況下,您應該使用鎖。
通常,當您涉及多個涉及讀取和寫入的相關原子操作時,就會出現問題。
注意單
x += 1
不是原子的,python 可以在讀取x
但在重新分配之前切換線程。 因此,如果該行有多個線程,則應使用鎖,否則將出現不可預測的行為。 ( x
值可能比您預期的要小)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.