Я попытался использовать BaseManager и зарегистрировать свой настроенный класс, чтобы сделать его счастливым, и получить проблему с вложенным классом, как Том уже упоминал выше.
Я думаю, что основная причина не имеет отношения к вложенному классу, как было сказано, но механизм коммуникации, который питон использует на низком уровне. Причина в том, что Python использует некоторый механизм обмена данными, подобный сокету, для синхронизации изменения настроенного класса в процессе сервера на низком уровне. Я думаю, что он инкапсулирует некоторые методы rpc, делает его просто прозрачным для пользователя, как если бы он вызывал локальные методы объекта вложенного класса.
Таким образом, когда вы хотите изменить, получить свои собственные объекты или некоторые сторонние объекты, вы должны определить некоторые интерфейсы в своих процессах для связи с ним, а не напрямую получать или устанавливать значения.
Тем не менее, при работе с вложенными объектами во вложенных объектах, можно игнорировать проблемы, упомянутые выше, так же, как вы делаете это в своей обычной подпрограмме, потому что ваши вложенные объекты в зарегистрированном классе больше не являются объектами прокси который операция не будет проходить через процедуру сокет-подобный снова и локализован.
Вот рабочий код, который я написал для решения проблемы.
from multiprocessing import Process, Manager, Lock
from multiprocessing.managers import BaseManager
import numpy as np
class NestedObj(object):
def __init__(self):
self.val = 1
class CustomObj(object):
def __init__(self, numpy_obj):
self.numpy_obj = numpy_obj
self.nested_obj = NestedObj()
def set_value(self, p, q, v):
self.numpy_obj[p, q] = v
def get_obj(self):
return self.numpy_obj
def get_nested_obj(self):
return self.nested_obj.val
class CustomProcess(Process):
def __init__(self, obj, p, q, v):
super(CustomProcess, self).__init__()
self.obj = obj
self.index = p, q
self.v = v
def run(self):
self.obj.set_value(*self.index, self.v)
if __name__=="__main__":
BaseManager.register('CustomObj', CustomObj)
manager = BaseManager()
manager.start()
data = [[0 for x in range(10)] for y in range(10)]
matrix = np.matrix(data)
custom_obj = manager.CustomObj(matrix)
print(custom_obj.get_obj())
process_list = []
for p in range(10):
for q in range(10):
proc = CustomProcess(custom_obj, p, q, 10*p+q)
process_list.append(proc)
for x in range(100):
process_list[x].start()
for x in range(100):
process_list[x].join()
print(custom_obj.get_obj())
print(custom_obj.get_nested_obj())