簡體   English   中英

Python布爾線程安全

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM