2017-11-16 8 views
1

아래 코드를 확인하십시오.왜 파이썬 다중 처리에서 dict가 업데이트되지 않습니까?

dict을 초기화하고 함수 f로 보냅니다. return_dict의 주소를 확인했습니다. 프로세스 내에서 변경되지 않습니다. 그래서 나는 그 딕트가 업데이트되어야한다고 생각했다.

그러나 그것은 업데이트되지 않는다. 왜 그런가? 귀하의 Process()

from multiprocessing import Process 

return_dict = dict({}) 
print id(return_dict) 


def f(value, return_dict): 
    return_dict['value'] = value 
    print return_dict 


p = Process(target=f, args=(100, return_dict)) 
p.start() 
p.join() 
print return_dict 

답변

4

다른 프로세스를 생성한다. 자식 프로세스가 생성 될 때 부모 프로세스의 개체를 그대로 상속하지만 이러한 개체를 수정하면 자식 프로세스 메모리의 개체 만 수정되며 이러한 변경 사항은 부모에게 표시되지 않습니다.

당신은 Manager()를 사용하여이를 극복 할 수

from multiprocessing import Process, Manager 

def f(value, return_dict): 
    return_dict['value'] = value 
    print return_dict 

d = Manager().dict()  
p = Process(target=f, args=(100, d)) 
p.start() 
p.join() 
print d 
+0

그러나 return_dict의 메모리 주소가 변경되지 않습니다. 그것을 설명하는 방법? 그들이 다른 객체라면, 주소는 내가 생각하는 것과 같아서는 안됩니다. 만약 그들이 같은 개체를 누른 부모 변경 프로세스를 볼 수 있어야합니다 –

+0

나는 메모리 주소가 프로세스 메모리 공간에 상대적인 컴퓨터의 메모리 내의 절대 주소가 아닌 것으로 가정합니다. 상위 프로세스의 오브젝트가 힙의 위치 X에 있으면, 하위가 생성 될 때이 오브젝트의 1 대 1 사본을 수신하게됩니다. 오브젝트 주소는 컴퓨터 내의 다른 프로세스 및 다른 메모리 세그먼트 임에도 불구하고 여전히 X에 있습니다. 세그먼트 프로세스 오류를 일으킬 수 있으므로 하위 프로세스는 부모 프로세스 메모리에 액세스 할 수 없습니다. – Hannu