我需要在多个进程之间共享一个dict
对象。每个进程在其运行时将读取或修改现有项目和/或将新项目添加到dict中。我使用的manager
multiprocessing
对象与此代码类似:
import multiprocessing as mp
def init_d(d, states):
for s in states:
if tuple(list(s) + [0]) not in d:
for i in range(4):
d[tuple(list(s) + [i])] = 0
if __name__ == '__main__':
with mp.Manager() as manager:
master_d = manager.dict()
states1 = [(1, 2), (3, 4)]
states2 = [(1, 2), (5, 6)]
p1 = mp.Process(target=init_d, args=(master_d, states1))
p2 = mp.Process(target=init_d, args=(master_d, states2))
p1.start()
p2.start()
p1.join()
p2.join()
print(master_d)
但是,对于我的特定用法来说,它非常慢。除了形成Manager比共享内存慢的事实(根据python doc),更重要的问题是在我的应用程序中,每个进程一次只读取/修改/添加一个dict项目与其他人无关。因此,我不知道是否锁定整个dict对象,这导致了巨大的减速,我想知道是否有办法例如仅锁定__get_item__
和__set_item__
方法中的特定项。
我看过几个相关的问题,但没有答案。请不要告诉我有关螺纹安全和锁定的信息。另外,我不是在寻找通用案例,而是:
dict
可能非常大,我以某种方式依赖哈希表的O(1)属性。因此,我不能使用list或tuple。非常感谢任何帮助。