2014-12-03 6 views
0

Я пытаюсь написать простую тестовую программу в python с использованием многопроцессорной обработки. Я использую Pool.map(). Для этого я передаю метод, который должен быть вызван дочерним процессом. Он работает правильно, и я получаю ожидаемый результат, когда тип возвращаемого значения является встроенным типом python, например string, datetime и т. Д. Однако, когда я использую свой пользовательский класс как возвращаемый тип, мой процесс просто зависает. Не уверен, что я поступаю правильно, любые предложения будут высоко оценены. вот мой код ниже:Невозможно вернуть пользовательский объект при использовании метода карты пула Python

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. ОС - это Windows-32 бит/64 бит.

+0

Вы не возвращаете класс, вы возвращаете вызов метода экземпляра внутри класса: 'return Cf (* arg, ** kwarg)' –

ответ

0

pool.map возвращает iterable, который не имеет метода wait.

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

Нет необходимости ждать, потому что «Он блокируется до тех пор, пока результат не будет готов».

+0

Вы прямо здесь .. метод wait() не должен были там .. Я пытался использовать map_async(), а остальное от этого. – LearnToLive

+0

Так что же вы в конечном итоге использовали? Код без «ожидания» работает для меня ... Если это ответ на ваш вопрос, пожалуйста, примите его. Если нет - измените вопрос или объясните, что не так. –

+0

Код (без wait()) отлично работает. Но в f() я возвращаю строку. Если я попытаюсь вернуть список списков пользовательских объектов ... это не сработает ... программа никогда не возвращается ... обновляется f(). Это то, чего я пытаюсь достичь. В очередной раз благодарим за помощь. – LearnToLive