Я тестирование питона мультипроцессирование с простой программой: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
Я думаю, что ответ может быть здесь: http://stackoverflow.com/questions/20955683/python-multiprocessing -sharing-a-complex-object и здесь: http://stackoverflow.com/a/33701697/289011 (в частности, часть, в которой указатели _address являются виртуальными, поэтому они представляют смещение внутри t он сам обрабатывает адресное пространство_) – BorrajaX
Так должно быть, что по совпадению основной процесс и дочерний процесс имеют исходный объект (основной процесс) и скопированный объект (дочерний процесс) с тем же смещением в своих соответствующих виртуальных адресных пространствах? – dylan7
Это должно быть ... Я должен сказать, это меня тоже озадачило **: - S ** Это хороший вопрос (по крайней мере, это помогло мне узнать что-то, что я думал, что это сработает по-другому) – BorrajaX