2017-10-26 8 views
1

클래스 인스턴스 목록이 있습니다. 이 클래스 객체 각각에는 실행하려는 메소드 함수가 있으며 많은 클래스 인스턴스가 있기 때문에 클래스 인스턴스 전체에서 병렬 처리하려고합니다. 예를 들어,이 클래스 객체가 있습니다 클래스 인스턴스 목록을 다중 처리로 전달합니다. 각 클래스의 메소드 실행중인 함수를 병렬 처리하고 병렬 처리합니다.

class Person(object): 
    def __init__(self, name): 
     self.name = name 
    def register(self): 
     self.registered = True 

지금 내가 사람의 값에 걸쳐 Person.register() 방법 기능의 실행을 병렬화 할 Person()

persons = [Person(i) for i in ["Bernard", "Enrik", "Joseph"]] 

의 클래스 인스턴스의 목록을 정의했다. 다중 처리 사용 .Pool, 여기 내가 한 일. 메서드 함수를 피클 할 수 없으므로 다른 함수로 래핑합니다.

import multiprocessing as mp 
def reg(person): 
    person.register() 
pool = mp.Pool(processes=mp.cpu_count()//2) 
res = list(pool.map(reg, persons)) 

코드는 그래서 지금은 목록에있는 모든 사람의 인스턴스가 True에 속성 registered 설정을해야합니다하지만 각 클래스의 인스턴스를 확인할 때,이 속성을 포함하지 않는 것을 기대하고, 그런데 오류없이 실행 registered. 예를 들어, registered이 persons [0]의 속성인지 확인하면,

hasattr(persons[0], "registered") 
>>> False 

왜 이런가요? 이 문제를 어떻게 해결할 수 있습니까?

+0

지도가 있습니다. 좋은 시작입니다. 이제 컨테이너에서 수집하고 행복하게. 'list (map (reg, persons))'가 모든'Person's에 대한 속성을 설정할 것입니다.) – Uvar

+0

당신은 내가 넣어야 함을 의미합니까? 'Person.register()'의 return 문과'list (pool.map (reg, persons)) '가 주어지면 각 클래스 객체에'registered' 속성을 명시 적으로 할당하는 또 다른 함수를 실행해야합니까? – bninopaul

답변

1

여기에서도 비슷한 문제가 발견되었습니다. Python multiprocessing with pathos. Person 클래스 인스턴스가 registered 속성을 가지고 있지 않은 이유는 다중 처리에서 Pool이 래퍼 함수 reg()에서 클래스 인스턴스를 반환하기 때문에 목록에서 클래스 인스턴스의 복사본 인 프로세스를 생성하므로이 문제를 해결하기 위해서입니다. 즉,

def reg(person): 
    person.register() 
    return person 
pool = mp.Pool(processes=mp.cpu_count()//2) 
persons = list(pool.map(reg, persons)) 
+0

내 자신의 클래스, 메서드 및 래퍼 함수를 ​​사용하여이 작업을 수행하고 있지만이 코드는 다음과 같이 될 수 있습니다. '_pickle.PicklingError : 피킹 할 수 없습니다. : __main__에 대한 속성 조회가 실패했습니다.' ? – someoneb100

+0

@ someoneb100, 래퍼 reg() 함수가 클래스 외부에 있는지 확인 했습니까? – bninopaul

+0

예 https://stackoverflow.com/questions/47795810/applying-a-method-in-a-list-of-class-objects-using-multiprocessing 여기 내 문제입니다. – someoneb100