2016-06-22 3 views
1

데이터 구조가 L (목록, dict ... 일 수 있습니다.) 및 여러 프로세스를 읽어야합니다. 느리기 때문에 multiprocessing.Manager을 사용하고 싶지 않습니다.파이썬 다중 처리 - 참조 된 객체는 언제 공유합니까? 언제 복사됩니까?

L이 수정되지 않은 경우 internet은 copy-on-write 덕분에 자식 프로세스가 완전히 복사하지 않는다고 말했습니다. 그러나 객체가 a에 의해 참조되는 경우 L은 자체가 수정됩니까? copy-on-write는 여전히 적용됩니까? 예 : 모듈 a

from multiprocessing import Pool 
from a import A 

READONLYLIST = list(range(pow(10, 6))) # list will never be modified 
a = A(READONLYLIST) # object a will be modified 

def worker(x): 
    return a.worker(x) 

print(Pool(2).map(worker, range(10))) 

같이

import random 

class A(object): 
    def __init__(self, readonlylist): 
     self.readonlylist = readonlylist 
     self.v = 0 

    def worker(self, x): 
     self.v = random.random() # modify the object 
     return x + self.readonlylist[-1] 

READONLYLIST 완전히이 경우 자식 프로세스로 복사 할 수 있습니까?

+0

테스트하지는 않았지만 파이썬에서 copy-on-write 객체로 * anything *을 쓰면 레퍼런스 카운트가 변경 될 것이므로 복사 될 것입니다. – Blckknght

+0

@Blckknght : 단순한 조회를 제외하고는 뭐죠? –

답변

0

파이썬 multiprocessing은 프로세스간에 메모리를 공유하지 않고 프로세스간에 메모리를 공유하지 않고 (피연산자를 포함하여) 프로세스를 피클 링 (개체를 문자열로 나타냄)하여 전달합니다. 따라서 풀 내에서 함수를 호출하면 주 프로세스가 함수를 pickle하고 함수의 절편 된 표현을 각 하위 프로세스로 전달한 다음 각 하위 프로세스가 해당 함수를 자체 메모리에 둡니다.

관련 문제