>백엔드 개발 >파이썬 튜토리얼 >'InstanceMethod를 피클할 수 없음'으로 인해 다중 처리가 실패하는 이유는 무엇이며 어떻게 해결할 수 있습니까?

'InstanceMethod를 피클할 수 없음'으로 인해 다중 처리가 실패하는 이유는 무엇이며 어떻게 해결할 수 있습니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-12 22:05:14553검색

Why Does Multiprocessing Fail with

다중 처리의 오류 처리: "InstanceMethod를 Pickle할 수 없습니다."

다중 처리에서 Pool.map() 함수는 동시 실행을 위해 작업을 프로세스 간에 나눕니다. 그러나 주어진 코드에서 볼 수 있듯이 바인딩된 메서드를 사용할 때 오류가 발생할 수 있습니다.

import multiprocessing

def f(x):
    return x*x

def go():
    pool = multiprocessing.Pool(processes=4)        
    print pool.map(f, range(10))


if __name__== '__main__' :
    go()

이 코드는 원활하게 작동합니다. 그러나 보다 객체 지향적인 접근 방식을 사용하면 오류가 발생하여 실패할 수 있습니다.

PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup
__builtin__.instancemethod failed

이 오류는 다음 코드에서 볼 수 있듯이 바인딩된 메서드와 함께 Pool.map()을 사용하려고 할 때 발생합니다.

import someClass

if __name__== '__main__' :
    sc = someClass.someClass()
    sc.go()

class someClass(object):
    def __init__(self):
        pass

    def f(self, x):
        return x*x

    def go(self):
        pool = multiprocessing.Pool(processes=4)       
        print pool.map(self.f, range(10))

해결 방법:

이 문제는 다중 처리 요구 사항에서 비롯됩니다. 개체를 피클하여 프로세스 간에 배포합니다. 그러나 바인딩된 메서드는 본질적으로 피클 가능하지 않습니다. 솔루션에는 피클링을 활성화하는 데 필요한 인프라를 구축하는 것이 포함됩니다.

한 가지 접근 방식은 피클링 및 피클링 해제 기능을 등록하기 위해 copy_reg 표준 라이브러리 방법을 사용하는 것입니다. 예를 들어 관련 토론 스레드에 대한 Steven Bethard의 기여는 copy_reg를 사용하여 메소드 피클링 및 피클링 해제에 대한 실행 가능한 접근 방식을 제공합니다.

위 내용은 'InstanceMethod를 피클할 수 없음'으로 인해 다중 처리가 실패하는 이유는 무엇이며 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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