在多線程環境下,如果多個線程同時訪問和修改共享數據(例如,字典、列表等),可能會導致數據不一致或其他未定義的行為
以下是一個使用threading.Lock
保護字典更新操作的示例:
import threading
class SafeDict(dict):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self._lock = threading.Lock()
def update(self, *args, **kwargs):
with self._lock:
super().update(*args, **kwargs)
# 示例用法
safe_dict = SafeDict()
def update_dict(key, value):
safe_dict.update({key: value})
# 創建并啟動多個線程,同時更新字典
threads = []
for i in range(10):
t = threading.Thread(target=update_dict, args=(i, i * 2))
threads.append(t)
t.start()
# 等待所有線程完成
for t in threads:
t.join()
print(safe_dict)
這個示例中,我們創建了一個名為SafeDict
的自定義字典類,它繼承自內置的dict
類。我們在SafeDict
中添加了一個鎖(threading.Lock
),并在update
方法中使用with
語句確保在更新字典時持有鎖。這樣,在多線程環境下,只有一個線程能夠同時更新字典,從而避免了數據不一致的問題。
請注意,這種方法可能會降低程序的性能,因為線程需要等待獲取鎖。在高并發場景下,可以考慮使用其他并發原語,如Semaphore
、Condition
或Event
,或者使用線程安全的數據結構,如queue.Queue
。