작업을 수행하는 데 Pool
에서 사용하는 프로세스간에 동기화되는 내용에 대해 생각해 보면 그리 놀라운 것은 아닙니다. I
함수의 인수와 반환 값만 현재 코드에서 동기화되므로 x
과 y
은 호출 프로세스에서 원래 값을 유지합니다.
현재 코드가 최소한의 테스트 케이스라고 생각합니다. Pool.map
을 사용하여 배열을 다른 배열로 복사하는 의미있는 구현이 없으므로 까다로운 문제입니다. 여기에 사소한 솔루션입니다,하지만 난 그게 진짜 작업이 무엇이든에 일반화 확실하지 않다 : 이것은 (아무것도 그것으로 수행되지 않습니다) 다른 프로세스를 통해 x
의 각 값을 전달하고 결과 값은
import numpy as np
from multiprocessing import Pool
def I(v):
return v
if __name__ == "__main__": # this boilerplate is required on on Windows
x = np.random.random(100)
y = np.random.random(100)
pool = Pool()
y[:] = pool.map(I, x)
print(x == y) # [True, True, True, ...]
다시 전달되고 y
에 할당됩니다 (pool.map는 목록을 반환 함). 그것은 꽤 어리 석다.
약간 더 정교한 접근 방식은 Pool
생성자에서 initializer
및 initargs
인수를 사용하여 작업자 프로세스에 걸쳐 x
를 복사 할 수 있습니다. 여기 않는 예제가 :
import numpy as np
from multiprocessing import Pool
def I(index):
return x[index]
def setup(value):
global x
x = value
if __name__ == "__main__":
x = np.random.random(100)
y = np.random.random(100)
pool = Pool(initializer=setup, initargs=(x,))
y[:] = pool.map(I, range(100))
print(x == y) # [True, True, True, ...]
한 방향으로 만 복사하는 x
불구하고 주. I
이 값을 수정하면 변경 내용이 프로세스간에 동기화되지 않습니다.
작업이 원본 및 대상 배열 모두에 대해 동기화 된 액세스가 실제로 필요한 작업 인 경우 multiprocessing.Array
을 시도해보십시오. 직접적인 경험은 없지만 y
을 동기화 된 버전으로 대체 할 수 있어야합니다. 불행히도, 동기화가 여러분의 프로그램을 느리게 할 것이라고 생각합니다. 정말 필요하지 않으면 그렇게하지 마십시오!
사실, 파이썬은'다중 처리. 프로세스 '사이의 자원을 잘 공유하지 않습니다. [zeromq divide and conquer pattern] (http://zguide.zeromq.org/page:all#Divide-and-Conquer)를'multiprocessing.Process'와 함께 사용하는 것이 좋습니다. 리소스를 공유하고 싶다면 스레드를 사용하십시오 (ThreadPools에는 라이브러리가 있습니다). – bitcycle