在多处理中使用项目级锁定共享字典(无需管理器)

Meh*_*hdi 5 python dictionary shared-memory multiprocessing

我需要dict在多个进程之间共享一个对象。每个进程在运行时都会读取或修改现有项目和/或将新项目添加到字典中。我正在使用manager来自的对象multiprocessing类似于此代码的

\n\n
import multiprocessing as mp\n\ndef init_d(d, states):\n    for s in states:\n        if tuple(list(s) + [0]) not in d:\n            for i in range(4):\n                d[tuple(list(s) + [i])] = 0\n\nif __name__ == \'__main__\':\n    with mp.Manager() as manager:\n        master_d = manager.dict()\n\n        states1 = [(1, 2), (3, 4)]\n        states2 = [(1, 2), (5, 6)]\n\n        p1 = mp.Process(target=init_d, args=(master_d, states1))\n        p2 = mp.Process(target=init_d, args=(master_d, states2))\n        p1.start()\n        p2.start()\n        p1.join()\n        p2.join()\n\n        print(master_d)\n
Run Code Online (Sandbox Code Playgroud)\n\n

然而,对于我的特定使用来说,它非常慢。除了 Manager 比共享内存慢这一事实(根据python doc)之外,更重要的问题是在我的应用程序中,每个进程一次仅读取/修改/添加字典的一项,而没有任何事情可做与其余的。因此,我想知道是否有一种方法可以仅锁定特定项目,而不是锁定整个 dict 对象(这会导致速度大幅下降__get_item____set_item__。\xc2\xa0

\n\n

我看到了几个相关的问题,但没有答案。请不要告诉我有关线程安全和锁定的内容。另外,我不是在寻找一般情况,而是:

\n\n
    \n
  1. 我需要一种实现,允许一个进程读取字典的一项,同时通过另一个进程修改另一个项,还可能通过另一个进程添加一个新项,所有这些都在同一时间。\xc2\xa0
  2. \n
  3. dict可能非常大,并且我以某种方式依赖哈希表的 O(1) 属性。因此,我不能使用列表或元组来代替。
  4. \n
  5. 每个进程仅读取/修改/添加一项。因此,本地字典然后在最后(在一批本地更新之后)更新共享字典不是一种选择。
  6. \n
\n\n

非常感谢任何帮助。

\n