나는 다음과 같은 시도하고있다 :파이썬 다중 처리 : 객체가 값으로 전달 되었습니까?
from multiprocessing import Pool
def f(some_list):
some_list.append(4)
print 'Child process: new list = ' + str(some_list)
return True
if __name__ == '__main__':
my_list = [1, 2, 3]
pool = Pool(processes=4)
result = pool.apply_async(f, [my_list])
result.get()
print 'Parent process: new list = ' + str(my_list)
내가 무엇을 얻을 :
Child process: new list = [1, 2, 3, 4]
Parent process: new list = [1, 2, 3]
그래서, 그것은 돌연변이하지 않았다 이후 을 my_list이 값에 의해 전달 된 것을 의미한다. 그래서 다른 프로세스로 넘어갈 때 실제로 값으로 전달된다는 규칙이 있습니까? 감사합니다. .
감사합니다. f 함수가 수정 된 객체를 반환하도록하면 어떻게 될까요? Manager를 사용하는 것과 비교할 때 효율성이 많이 떨어질까요? – jazzblue
@jazzblue 유스 케이스를 사용하여 자식의 목록을 수정하고 부모에게 반환 할 수있게하려면 'Manager'대신 해당 목록을 사용하십시오. 'Manager' 객체를 사용하면 공유 목록에 액세스 할 때마다 실제로'Manager' 프로세스에 IPC 호출을합니다. 이것은 목록에 기본적으로 액세스하는 것보다 훨씬 느립니다. 객체를 부모에게 반환하면 프로세스간에 목록 객체를 전달하는 일회성 IPC 히트를 취하지 만 거대한 목록을 다루지 않는 한 모든 객체의 비용을 능가하지는 않을 것입니다 IPC는 공유 목록에 필요합니다. – dano