2017-02-07 1 views
0

아래의 일반적인 예제에서 사전의 관리에는 Foobar_Collection을 사용합니다. Additionaly, Foobar_Collection은 을 순전히 Foo의 모든 특성으로 공유하는 방법을 사용합니다. 그것은 지금까지 잘 작동합니다. 그러나 다중 처리의 을 활용할 수 있으니 run_myMethodForAllfoobars()은 여러 청크 인스턴스에 대해 작업을 나눌 수 있습니까? 인스턴스 메소드는 서로 "독립적"입니다 (이 경우는 난처하게 병렬이라고합니다). 어떤 도움이라도 좋을 것입니다!클래스 인스턴스 사전에 대한 다중 처리

class Foobar_Collection(dict): 
    def __init__(self, *arg, **kw): 
     super(Foobar_Collection, self).__init__(*arg,**kw) 
    def foobar(self,*arg,**kw): 
     foo = Foo(*arg,**kw) 
     self[foo.name] = foo 
     return foo 

    def run_myMethodForAllfoobars(self): 
     for name in self: 
      self[name].myMethod(10) 
     return None 


class Foo(object): 
    def __init__(self,name): 
     self.name = name 
     self.result = 0 
    # just some toy example method  
    def myMethod(self,x): 
     self.result += x 
     return None 

Foobar = Foobar_Collection() 
Foobar.foobar('A') 
Foobar.foobar('B') 
Foobar.foobar('C') 
Foobar.run_myMethodForAllfoobars() 

답변

1

당신은 이 상황에 multiprocessing을 사용할 수 있지만 병렬 처리하려는 방법은 부작용이 아닌 반환 값에 유용하기 때문에 큰 아니다. 즉, Foo 객체를 양방향으로 직렬화해야합니다 (자식 프로세스로 전송 한 다음 수정 된 버전을 다시 전송). 실제 개체가 예제의 Foo 개체보다 복잡하면 각 개체의 데이터를 모두 복사하는 오버 헤드로 인해 한 프로세스에서 모든 작업을 수행하는 것보다 느려질 수 있습니다.

def worker(foo): 
    foo.myMethod(10) 
    return foo 

class Foobar_Collection(dict): 
    #... 

    def run_myMethodForAllfoobars(self): 
     with multiprocessing.Pool() as pool: 
      results = pool.map(worker, self.values()) 
     self.update((foo.name, foo) for foo in results) 

더 나은 디자인을 사용하면 계산에 필요한 정보 만 일련화할 수 있습니다. 당신의 예에서, 당신은 Foo 객체에서 필요한 유일한 것은 자사의 result 개체의 나머지 주위를 통과하지 않고 추출 할 수 및 프로세스 (당신이 10를 추가 할 것입니다있는) : 이제 분명히

def worker(num): 
    return num + 10 

class Foobar_Collection(dict): 
    #... 

    def run_myMethodForAllfoobars(self): 
     with multiprocessing.Pool() as pool: 
      results = pool.map(worker, (foo.result for foo in self.values())) 
     for foo, new_result in zip(self.values(), results): 
      foo.result = new_result 

실제로는 을 foo 개체에서 더 이상 실행하지 않습니다 (그렇게하는 것과 같습니다). 이와 같이 객체와 메서드를 분리 할 수 ​​없다면 성능이 좋지 않을 수 있습니다.

+0

사실, 당신이 제안한 것처럼 내 방법을 분리 할 수 ​​있습니다. 힌트와 도움에 감사드립니다. 나는 mp가 자동적으로 사전을 "나누기"를 가정한다고 가정한다. 귀하의 대답에 관해서는, 나는'for 루프'lil 오류 ('new_result')가 포함되어 생각하십니까? 그러나, 나는 그것이 나 자신을 위해 일하는 것을 미친다. – Tim

+0

와우, 결과를 foo 객체와 일치시키는'zip' 호출을 생략했습니다. – Blckknght

+0

그게 내가 해결 한 방법이기도하다.) – Tim