왜 자식 프로세스가 다른 개체 주소를 출력하는지 궁금합니다. 관리자와 시도했지만 결과에 영향을주지 않습니다.파이썬 다중 처리 : 객체 인스턴스가 같은 주소를 갖는 이유는 무엇입니까?
import time
import multiprocessing as mp
class TestO:
def __init__(self, a):
self.a = a
def get_name(self):
return self.a
def run_task(tasks,nr):
obj = tasks[nr]['data']
print obj, obj.get_name()
if __name__ == "__main__":
tasks = dict()
a = TestO('first')
b = TestO('second')
tasks[1] = {'data': a}
tasks[2] = {'data': b}
process1 = mp.Process(target = run_task, name = 'process1', args = (tasks, 1))
process2 = mp.Process(target = run_task, name = 'process2', args = (tasks, 2))
process1.start()
time.sleep(0.2)
process2.start()
process1.join()
process2.join()
print a, 'first'
print b, 'second'
이 결과
<__main__.TestO instance at 0x02EFD2D8> first
<__main__.TestO instance at 0x0373D300> second
<__main__.TestO instance at 0x043663C8> first
<__main__.TestO instance at 0x043663F0> second
을 줄 것이다는 인스턴스를 복사하고 있습니까? 어떻게 든 동일한 인스턴스를 유지할 수있는 방법이 있습니까? 클래스 객체가 더 복잡한 위의 더 복잡한 버전에 문제가 있습니다. 이 경우 얻을 수있는 결과는 객체 인스턴스에 설정 한 값이 mp.Process
을 입력 한 후에 무효화됩니다. 즉, obj.get_name
이 None
을 반환합니다.
내가 제공 한 예제로 공유 메모리를 어떻게 사용할 수 있습니까? 나는 관리자를 사용하는 것이 공유 메모리와 같을 것이라고 생각했지만,이 경우에도 다른 주소를 얻는다. – Chicony
GIL이 실제 공유 메모리를 막았 기 때문에'mp.Process'에 대한 인수가 직렬화되지 않았습니까? – erip
@Chicony : 관리자를 사용하면 공유를 얻을 수 있지만 "가상 메모리"때문에 주소가 여전히 달라집니다. 가상 메모리를 읽으면 볼 수 있습니다. 두 개의 서로 다른 가상 주소에 두 가지가 있기 때문에 두 개의 다른 프로세스에 대해 이야기 할 때 동일한 인스턴스인지 여부는 알려주지 않습니다. –