在多处理中使用项级锁定共享字典(不使用Manager)

时间:2017-08-18 19:43:28

标签: python dictionary multiprocessing shared-memory

我需要在多个进程之间共享一个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__方法中的特定项。

我看过几个相关的问题,但没有答案。请不要告诉我有关螺纹安全和锁定的信息。另外,我不是在寻找通用案例,而是:

  1. 我需要一个实现,允许通过一个进程读取字典项,同时通过另一个进程修改另一个项,也可以同时通过另一个进程添加新项。
  2. dict可能非常大,我以某种方式依赖哈希表的O(1)属性。因此,我不能使用list或tuple。
  3. 每个进程只读取/修改/添加一个项目。因此,本地字典然后在最后(在一批本地更新之后)更新共享字典不是一种选择。
  4. 非常感谢任何帮助。

0 个答案:

没有答案