在多线程环境下,如果多个线程同时访问和修改共享数据(例如,字典、列表等),可能会导致数据不一致或其他未定义的行为
以下是一个使用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
。