> 백엔드 개발 > 파이썬 튜토리얼 > Python의 다중 처리를 위해 공유 메모리에서 NumPy 배열을 어떻게 사용할 수 있습니까?

Python의 다중 처리를 위해 공유 메모리에서 NumPy 배열을 어떻게 사용할 수 있습니까?

Susan Sarandon
풀어 주다: 2024-12-06 08:08:10
원래의
1028명이 탐색했습니다.

How Can I Use NumPy Arrays in Shared Memory for Multiprocessing in Python?

다중 처리를 위해 공유 메모리에서 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿