首页 > 解决方案 > 在python中使用具有多个多处理共享对象(dict,list,variables)的多处理字典

问题描述

我想通过多处理共享多处理列表、字典和变量。如果我将这 3 个作为单独的参数发送给我想要多处理的函数,我就可以编码和使用它们。但是,只要我使用多处理字典或普通字典来存储这三个共享对象,然后将该字典作为单个参数发送到 function 。我得到一个 RuntimeError: shared objects should only be shared using Inheritance

import multiprocessing as mp 
from multiprocessing.sharedctypes import Value

def final(D):

    if 0 not in D["first"][0]:
        D["first"][0].update({0:D["first"][2]})
        num = D["first"][2].value
        D["first"][2].value+=1
        if D["first"][2].value ==3:
            D["first"][2].value=0
    else:
        num = D["first"][2].value

    print("num is {}".format(num))

if __name__ == '__main__':

    l=mp.Manager().list(range(5))
    v=Value("i",0)
    d= mp.Manager().dict()
    D= mp.Manager().dict()
    # D={}

    D.update({"first": [d,l,v]})

    p= mp.Process(target=final,name = "process", args=(D,))
    p.start()
    p.join()

这是我得到的错误

Process process:
Traceback (most recent call last):
  File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
    self.run()
  File "/usr/lib/python2.7/multiprocessing/process.py", line 114, in run
    self._target(*self._args, **self._kwargs)
  File "test.py", line 58, in d_final
    D["first"][0].update({0:D["first"][2]})
  File "<string>", line 2, in update
  File "/usr/lib/python2.7/multiprocessing/managers.py", line 758, in _callmethod
    conn.send((self._id, methodname, args, kwds))
  File "/usr/lib/python2.7/multiprocessing/sharedctypes.py", line 218, in __reduce__
    assert_spawning(self)
  File "/usr/lib/python2.7/multiprocessing/forking.py", line 52, in assert_spawning
    ' through inheritance' % type(self).__name__
RuntimeError: Synchronized objects should only be shared between processes through inheritance

我怎么能做到以上,因为我需要在一个字典中存储多个多进程字典、列表和变量,我可以在进程之间共享。字典应如下所示:-

D= { "first":[d,l,v] , "second":[d,l,v], "third":[d,l,v] ....... }

标签: pythonpython-2.7python-multiprocessing

解决方案


推荐阅读