2016-11-21 1 views
0

왜 자식 프로세스가 다른 개체 주소를 출력하는지 궁금합니다. 관리자와 시도했지만 결과에 영향을주지 않습니다.파이썬 다중 처리 : 객체 인스턴스가 같은 주소를 갖는 이유는 무엇입니까?

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_nameNone을 반환합니다.

답변

1

여러 프로세스를 생성하고 있습니다. 가상 메모리의 마법 덕분에 서로 다른 두 개의 프로세스가 동일한 주소를 가질 것으로 기대할 수는 없습니다. 귀하의 질문에 관해서는

:

어떻게 든 동일한 인스턴스를 유지하는 방법이 있나요?

별도의 프로세스를 시작하기 때문에 실제로는 아닙니다. 비록 당신이 주장한다면, 프로세스간에 데이터 구조의 단일 인스턴스를 공유하기 위해 "공유 메모리"를 사용할 수 있습니다.

+0

내가 제공 한 예제로 공유 메모리를 어떻게 사용할 수 있습니까? 나는 관리자를 사용하는 것이 공유 메모리와 같을 것이라고 생각했지만,이 경우에도 다른 주소를 얻는다. – Chicony

+0

GIL이 실제 공유 메모리를 막았 기 때문에'mp.Process'에 대한 인수가 직렬화되지 않았습니까? – erip

+1

@Chicony : 관리자를 사용하면 공유를 얻을 수 있지만 "가상 메모리"때문에 주소가 여전히 달라집니다. 가상 메모리를 읽으면 볼 수 있습니다. 두 개의 서로 다른 가상 주소에 두 가지가 있기 때문에 두 개의 다른 프로세스에 대해 이야기 할 때 동일한 인스턴스인지 여부는 알려주지 않습니다. –

관련 문제