Python 다중 처리 애플리케이션에서 프로세스 간에 잠금을 공유하는 방법

Barbara Streisand
풀어 주다: 2024-10-17 10:52:02
원래의
733명이 탐색했습니다.

How to Share Locks Between Processes in Python Multiprocessing Applications

Python을 사용하여 프로세스 간 잠금 공유

멀티 스레드 애플리케이션에서 잠금은 공유 리소스에 대한 액세스를 동기화하는 데 매우 중요합니다. 그러나 이러한 프로세스가 여러 하위 프로세스에 분산되면 이들 사이에 잠금을 공유하는 것이 어려울 수 있습니다.

문제:

다중 처리를 활용하는 기능을 고려하세요.잠금 () 중요한 리소스에 대한 액세스를 관리하는 개체(l)입니다. 작업자 프로세스 풀(pool)과 잠금을 인수로 전달하는 부분 함수(func)를 생성한 후 pool.map()을 사용하여 여러 프로세스에 작업을 배포하려고 하면 다음 런타임 오류가 발생합니다. 상속을 통해 프로세스 간에만 공유되어야 합니다."

요소 누락:

기본적으로 Python은 일반 multiprocessing.Lock() 인스턴스를 안전하게 피클할 수 없기 때문에 오류가 발생합니다. 프로세스 간 통신을 위한 것입니다.

해결책:

이러한 제한을 극복하고 프로세스 간에 잠금을 성공적으로 공유하려면 다음 두 가지 실행 가능한 접근 방식이 있습니다.

  1. Manager 개체 사용:

    • multiprocessing.Manager() 인스턴스(m)를 생성하고 안전한 데이터 공유를 허용하는 Manager.Lock()을 전달합니다.
    • 이 방법은 외부 관리자 프로세스와 IPC가 필요하기 때문에 추가 오버헤드가 발생합니다.
  2. 풀 생성 시 잠금 전달 :

    • 초기화 프로그램 kwarg를 사용하여 풀 초기화 시 일반 multiprocessing.Lock()(l)을 전달합니다.
    • 이렇게 하면 모든 하위 프로세스 내에서 잠금 인스턴스에 전역적으로 액세스할 수 있습니다. 부분 기능이 필요하지 않습니다.

코드 예(두 번째 솔루션 사용):

<code class="python">from multiprocessing import Pool, Lock

def init(l):
    global lock
    lock = l

def target(iterable_item):
    # Access shared resources using lock

def main():
    l = Lock()
    pool = Pool(initializer=init, initargs=(l,))
    pool.map(target, iterable)
    pool.close()
    pool.join()</code>
로그인 후 복사

다음 방법을 따르세요. , 프로세스 간 잠금을 효과적으로 공유하여 분산 Python 애플리케이션에서 동기화 및 데이터 공유를 활성화할 수 있습니다.

위 내용은 Python 다중 처리 애플리케이션에서 프로세스 간에 잠금을 공유하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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