다중 처리를 위해 공유 메모리에서 NumPy 배열 사용
Python에서 다중 처리 작업을 할 때 프로세스 간에 배열을 공유하는 것이 어려울 수 있습니다. 단순한 ctypes 배열이 아닌 NumPy 배열처럼 작동하도록 요구하는 경우 다중 처리에서 NumPy 배열을 사용하는 것이 어려울 수 있습니다.
문제 설명
제공된 예에서 , NumPy 배열은 ctypes Array() 객체로 래핑됩니다. 이를 통해 ctypes 방식으로 배열에 액세스할 수 있지만 NumPy 배열의 기능은 손실됩니다. -1*arr 또는 arr.sum()과 같은 작업은 수행할 수 없으며 이를 NumPy 배열로 다시 변환하면 공유 메모리가 손상됩니다.
shared_arr.get_lock()을 사용한 솔루션
공유 메모리 배열을 사용하는 동안 NumPy 배열 기능을 유지하려면 공유 메모리 배열에서 사용 가능한 get_lock() 메서드를 사용할 수 있습니다. 배열:
shared_arr = mp.Array(ctypes.c_double, N) def f(i): with shared_arr.get_lock(): arr = np.frombuffer(shared_arr.get_obj()) arr[i] = -arr[i]
get_lock() 메서드를 사용하면 공유 배열에 대한 액세스를 동기화하고 프로세스 내에서 NumPy 배열처럼 액세스되도록 할 수 있습니다.
예
다음 코드는 공유를 활용하면서 NumPy 배열 기능을 유지하는 향상된 예를 제공합니다. memory:
import multiprocessing as mp import numpy as np N = 100 shared_arr = mp.Array(ctypes.c_double, N) arr = np.frombuffer(shared_arr.get_obj()) # Fill the shared array with random values arr[:] = np.random.uniform(size=N) # Create a pool of processes with mp.Pool(initializer=init, initargs=(shared_arr,)) as pool: # Define functions that modify the shared array def f(i): with shared_arr.get_lock(): arr -= 1 # Subtract 1 from each array element within the process pool.map(f, range(N)) # Check the modified shared array assert np.allclose(arr, -1)
이 예에서 init() 함수는 각 프로세스에 대해 shared_arr을 설정하고 f() 함수는 잠금 내의 공유 배열에서 작동합니다. 수정된 공유 어레이는 풀에 참여한 후 기본 프로세스에서 액세스할 수 있습니다. 이 방법은 다중 처리에서 공유 배열을 사용하는 동기화되고 NumPy 호환 방법을 제공합니다.
위 내용은 Python의 다중 처리를 위해 공유 메모리에서 NumPy 배열을 어떻게 사용할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!