Использование многопроцессорного словаря с несколькими многопроцессорными общими объектами (dict, list, variable) в python - PullRequest
0 голосов
/ 31 мая 2019

Я хочу поделиться многопроцессорным списком, словарем и переменной через многопроцессорность. Я могу кодировать и использовать их, если я отправлю эти 3 в качестве отдельного аргумента для функции, которую я хочу многопроцессорным. Но как только я использую многопроцессорный словарь или обычный словарь для хранения этих трех общих объектов, а затем отправляю этот словарь в качестве одного аргумента в функцию. Я получаю RuntimeError: общие объекты должны быть разделены только с использованием 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] ....... }
...