2013-08-09 13 views
6

Ho un semplice pattern di consumer producer impostato in parte del mio codice GUI. Sto tentando di creare un profilo solo per la sezione consumer specifica per vedere se c'è qualche possibilità di ottimizzazione. Tuttavia, quando si tenta di eseguire il codice con python -m cProfile -o out.txt myscript.py viene visualizzato un errore generato dal modulo pickle di Python.Codice di Python di profilazione che utilizza la multiprocessing?

File "<string>", line 1, in <module> 
    File "c:\python27\lib\multiprocessing\forking.py", line 374, in main 
    self = load(from_parent) 
    File "c:\python27\lib\pickle.py", line 1378, in load 
    return Unpickler(file).load() 
    File "c:\python27\lib\pickle.py", line 858, in load 
    dispatch[key](self) 
    File "c:\python27\lib\pickle.py", line 880, in load_eof 
    raise EOFError 
EOFError 

Il modello di base nel codice è

class MyProcess(multiprocessing.Process): 
    def __init__(self, in_queue, msg_queue): 
     multiprocessing.Process.__init__(self) 
     self.in_queue = in_queue 
     self.ext_msg_queue = msg_queue 
     self.name == multiprocessing.current_process().name 

    def run(self): 
     ## Do Stuff with the queued items 

Questo è di solito alimentato compiti dal lato GUI delle cose, ma a scopo di test, ho impostato come segue.

if __name__ == '__main__': 

    queue = multiprocessing.Queue() 
    meg_queue = multiprocessing.Queue() 
    p = Grabber(queue) 
    p.daemon = True 
    p.start() 
    time.sleep(20) 
    p.join() 

Ma dopo aver provato a iniziare lo script, ottengo il messaggio di errore sopra riportato.

C'è un modo per aggirare l'errore?

risposta

3

A mio parere il modulo cProfile non funziona correttamente con multiprocessing sulla riga di comando. (Vedi Python multiprocess profiling.)

Un modo per ovviare a questo problema è eseguire il profiler all'interno del codice. In particolare, è necessario impostare un file di output del profiler diverso per ogni processo nel pool. Puoi farlo abbastanza facilmente chiamando il numero cProfile.runctx('a+b', globals(), locals(), 'profile-%s.out' % process_name).

http://docs.python.org/2/library/profile.html#module-cProfile

Problemi correlati