2016-10-25 2 views
2

Я тестирование питона мультипроцессирование с простой программой:Python Объекты в многопроцессорных

class MyTest: 
    def __init__(self): 
     self.myattr = 1 

    def myfunc(self): 
     print(self) 
     self.myattr=2 
     print(self) 
     print("in proc"+str(self.myattr)) 



def main(): 

    test = MyTest() 
    print(test) 
    myProc = Process(target = test.myfunc,args=()) 

    myProc.start() 
    myProc.join() 
    print(test.myattr) 

main() 

Выход себя в методе, на котором выполняется процесс имеет тот же адрес, что объект в основной, который я довольно странно, поскольку они являются отдельными процессами. Однако, поскольку они находятся на одном адресе, они фактически разделяются между процессами и обновляют атрибут myattr в myfunc, чтобы изменить attr теста в main. Однако print(test.myattr) по-прежнему печатает 1 даже после завершения процесса обновления атрибута test.

Мой первый вопрос: почему эти два объекта в отдельных процессах имеют один и тот же адрес, а второй - если они разделяют один и тот же адрес, почему не происходят изменения в одном процессе, распознаваемом изменениями в другом?

P.S. мой первый вопрос имеет какое-то отношение к тому, что я передаю процессу объектный метод для запуска в качестве своей цели? то есть вызов функции объекта, такой как test.myfunc = MyTest.myfunc (test).

Выход:

<__main__.MyTest object at 0x7f007bdf76d8> 
<__main__.MyTest object at 0x7f007bdf76d8> 
<__main__.MyTest object at 0x7f007bdf76d8> 
in proc2 
1 
+2

Я думаю, что ответ может быть здесь: http://stackoverflow.com/questions/20955683/python-multiprocessing -sharing-a-complex-object и здесь: http://stackoverflow.com/a/33701697/289011 (в частности, часть, в которой указатели _address являются виртуальными, поэтому они представляют смещение внутри t он сам обрабатывает адресное пространство_) – BorrajaX

+1

Так должно быть, что по совпадению основной процесс и дочерний процесс имеют исходный объект (основной процесс) и скопированный объект (дочерний процесс) с тем же смещением в своих соответствующих виртуальных адресных пространствах? – dylan7

+1

Это должно быть ... Я должен сказать, это меня тоже озадачило **: - S ** Это хороший вопрос (по крайней мере, это помогло мне узнать что-то, что я думал, что это сработает по-другому) – BorrajaX

ответ

0

Я думаю, вы должны использовать pathos, это упрощает мультипроцессирование с классами и работает как ветер.

Шаг 1:

pip install pathos 

Шаг 2:

рефакторинга кода, чтобы иметь возможность работать без __init__(), то есть метод класса, который работает то, что вы хотите запустить , переменные экземпляра должны быть в методе класса, который вы хотите запустить.

Шаг 3:

Затем запустите его же вы хотите.

Пример:

from pathos.multiprocessing import ProcessingPool as Pool 
p = Pool(4) 
class MyClass: 

    def add(self, x, y): 
     return x+y 

mc = MyClass() 
x = [1,2,3,4,5] 
y = [0,2,4,6,8] 
result = p.amap(mc.add, x, y) 
print result.get() 

Источник: https://stackoverflow.com/a/21345308/7372029

https://github.com/uqfoundation/pathos/tree/master/examples

Смежные вопросы