面试题答案
一键面试设计思路
- 数据结构选择:为了满足快速的插入、删除和查找操作,
dict
是一个很好的选择,因为它基于哈希表实现,平均情况下这些操作的时间复杂度为 O(1)。 - 同步机制:为了避免数据竞争和锁带来的性能瓶颈,可以使用
multiprocessing
模块中的Manager
来创建共享的数据结构。Manager
提供了一种进程安全的方式来共享数据,内部使用了锁和消息传递机制,但相比于直接使用锁,它能减少锁的粒度,提高并发性能。
使用的数据结构
- Python字典(
dict
):用于存储海量数据,利用其哈希表特性实现快速操作。
同步机制
multiprocessing.Manager
:提供共享对象,在多进程环境下保证数据的一致性和安全性。
关键代码示例
import multiprocessing
def worker(shared_dict, key, value):
# 插入操作
shared_dict[key] = value
# 查找操作
result = shared_dict.get(key)
print(f"Process {multiprocessing.current_process().name} found: {result}")
# 删除操作
if key in shared_dict:
del shared_dict[key]
if __name__ == '__main__':
manager = multiprocessing.Manager()
shared_dict = manager.dict()
processes = []
for i in range(5):
p = multiprocessing.Process(target=worker, args=(shared_dict, i, f"value_{i}"))
processes.append(p)
p.start()
for p in processes:
p.join()
在多线程场景下,可以使用 threading.Lock
,虽然有性能瓶颈但能保证数据一致性:
import threading
class ThreadSafeDict:
def __init__(self):
self.data = {}
self.lock = threading.Lock()
def insert(self, key, value):
with self.lock:
self.data[key] = value
def delete(self, key):
with self.lock:
if key in self.data:
del self.data[key]
def lookup(self, key):
with self.lock:
return self.data.get(key)
def thread_worker(thread_safe_dict, key, value):
thread_safe_dict.insert(key, value)
result = thread_safe_dict.lookup(key)
print(f"Thread {threading.current_thread().name} found: {result}")
thread_safe_dict.delete(key)
if __name__ == '__main__':
tsd = ThreadSafeDict()
threads = []
for i in range(5):
t = threading.Thread(target=thread_worker, args=(tsd, i, f"value_{i}"))
threads.append(t)
t.start()
for t in threads:
t.join()