>백엔드 개발 >파이썬 튜토리얼 >멀티프로세싱은 복제 없이 읽기 전용 공유 데이터를 공유할 수 있습니까?

멀티프로세싱은 복제 없이 읽기 전용 공유 데이터를 공유할 수 있습니까?

Barbara Streisand
Barbara Streisand원래의
2024-10-25 02:46:30254검색

Can Multiprocessing Share Read-Only Shared Data Without Replication?

다중 처리는 읽기 전용 공유 데이터를 복제합니까?

소개

다중 처리 시나리오에서는 공유 데이터를 보장하여 리소스 사용을 최적화하는 것이 중요합니다. 여러 프로세스에 걸쳐 중복되지 않습니다. 이러한 상황에서 읽기 전용 데이터가 처리되는 방식을 이해하면 상당한 메모리 및 성능 오버헤드를 줄일 수 있습니다.

질문

다음 Python 코드를 고려하세요.

<code class="python">glbl_array = # a 3 Gb array

def my_func(args, def_param=glbl_array):
    # do stuff on args and def_param

if __name__ == '__main__':
    pool = Pool(processes=4)
    pool.map(my_func, range(1000))</code>

보장할 수 있나요? 아니면 개별 복사본을 만들지 않고 여러 프로세스가 glbl_array를 공유하도록 장려하시겠습니까?

답변

중복 없이 공유 액세스를 보장하려면 Python의 다중 처리 모듈에서 제공하는 공유 메모리 메커니즘을 활용할 수 있습니다. 구현 방법은 다음과 같습니다.

<code class="python">import multiprocessing
import ctypes
import numpy as np

shared_array_base = multiprocessing.Array(ctypes.c_double, 10 * 10)
shared_array = np.ctypeslib.as_array(shared_array_base.get_obj())
shared_array = shared_array.reshape(10, 10)

# Parallel processing
def my_func(i, def_param=shared_array):
    shared_array[i, :] = i

if __name__ == '__main__':
    pool = multiprocessing.Pool(processes=4)
    pool.map(my_func, range(10))

    print(shared_array)</code>

구현 세부 정보

이 코드는 multiprocessing.Array 클래스를 사용하여 공유 메모리 배열(shared_array_base)을 생성합니다. 그런 다음 편리한 조작을 위해 Numpy 배열(shared_array)로 변환합니다.

주 함수(my_func)는 불필요한 복사를 방지하기 위해 shared_array를 기본 매개변수로 사용하며, Linux의 쓰기 시 복사 의미론은 데이터 중복을 보장합니다. 공유 영역을 수정하는 경우에만 발생합니다.

코드를 실행하면 공유 shared_array가 중복 없이 인쇄되어 프로세스가 동일한 메모리 개체를 공유했음을 나타냅니다.

위 내용은 멀티프로세싱은 복제 없이 읽기 전용 공유 데이터를 공유할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.