2014-12-03 6 views
0

나는 다중 처리를 사용하여 파이썬에서 간단한 테스트 프로그램을 작성하려고합니다. Pool.map()을 사용하고 있습니다. 그것에, 나는 자식 프로세스에 의해 호출되어야하는 메소드를 전달하고있다. 올바르게 작동하고 반환 형식이 파이썬 기본 제공 형식 (예 : 문자열, 날짜/시간 등) 일 때 예상되는 결과가 나타납니다. 그러나 사용자 지정 클래스를 반환 형식으로 사용하면 프로세스가 중단됩니다. 내가 옳은 일을하고 있는지 확실하지 않다면, 어떤 제안이라도 높게 평가 될 것입니다. 여기 내 코드는 다음과 같습니다.파이썬의 풀 맵 메서드를 사용할 때 사용자 지정 개체를 반환 할 수 없습니다.

from multiprocessing import Pool 
from multiprocessing.pool import ApplyResult 
import time 
import os 
import logging 
import multiprocessing 
import sys 


class C(object): 

    def __init__(self, a, b=1): 
     self.a = a 
     self.b = b   


    def f(self, name):    
     time.sleep(2) 

     #Doing some processing using custom classes 
     #and generating a result of custom type 

     x = someMethodInCustomClass() 

     # x now has list of list of custom objects eg x =[[c1,c2],[c3,c4]] 

     return x     
     #Above doesn't work. Returning string/datetime instead of x works fine.     

    def _run(self): 
     print 'Reached inside run..' 
     print 'main process id ..', os.getpid() 
     pool = Pool(processes=6) 
     names = ['frank', 'justin', 'osi', 'thomas', 'jim', 'rock', 'stonecold', 'machoman']   
     result = pool.map(unwrap_self_f, zip([self]*len(names), names), 1)   
     print type(result) 
     print result 


    def hello(self): 
     print 'Running hello....' 
     self._run() 

def test(): 
    logger.info('Starting....test') 
    c = C(1, 2) 
    print 'Running test....' 
    c.hello()  

def unwrap_self_f(arg, **kwarg): 
    print 'inside unwrap_self_f' 
    return C.f(*arg, **kwarg)  

if __name__ == '__main__': 
    print 'Loading multiprocessing...' 
    logger = multiprocessing.log_to_stderr() 
    logger.setLevel(logging.DEBUG) 
    test() 

저는 Python 2.6.6을 사용하고 있습니다. OS는 windows-32bit/64bit입니다.

+0

클래스를 반환하지 않으면 클래스 내의 인스턴스 메소드에 대한 호출을 반환합니다. 'return Cf (* arg, ** kwarg)' –

답변

0

pool.mapwait 메서드가없는 iterable을 반환합니다.

result = pool.map(unwrap_self_f, zip([self]*len(names), names), 1) 
    result.wait() # <--- no such thing 

"결과가 준비 될 때까지 차단됩니다"때문에 기다릴 필요가 없습니다.

+0

여기서 wait() 메소드는 shouldnt입니다. 거기에있다. 나는 map_async()도 사용하려고했는데, 그것으로부터 남은 것이다. – LearnToLive

+0

그래서 결국 무엇을 사용 했습니까? "기다림"이없는 코드는 나를 위해 일하고 있습니다 ... 귀하의 질문에 대한 대답이라면 동의하십시오. 그렇지 않은 경우 질문을 변경하거나 잘못 된 것이 무엇인지 설명하십시오. –

+0

코드 (wait()없이)는 잘 작동하지만 f()에서 문자열을 반환합니다. 사용자 지정 개체 목록의 목록을 반환하려고하면 .. 작동하지 않습니다 .. 프로그램이 반환되지 않습니다. 업데이트 된 f()를 봅니다. 그것이 내가 성취하려는 것입니다. 도와 줘서 고마워. – LearnToLive

관련 문제