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