2013-08-09 7 views
6

Ich habe ein einfaches Producer Consumer-Muster in einem Teil meines GUI-Codes eingerichtet. Ich versuche, nur den spezifischen Verbraucherabschnitt zu profilieren, um zu sehen, ob es eine Chance auf Optimierung gibt. Beim Versuch, den Code mit python -m cProfile -o out.txt myscript.py auszuführen, erhalte ich jedoch einen Fehler von Pythons pickle Modul.Profiling von Python-Code, der Multiprocessing verwendet?

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 

Das Grundmuster im Code ist

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 

Dies wird in der Regel Aufgaben von der GUI-Seite der Dinge geführt, aber für Testzwecke, habe ich es wie folgt auf.

Aber beim Versuch, das Skript zu starten, bekomme ich die obige Fehlermeldung.

Gibt es einen Weg um den Fehler?

Antwort

3

In meinem Verständnis spielt das cProfile Modul nicht gut mit multiprocessing auf der Befehlszeile. (Siehe Python multiprocess profiling.)

Eine Möglichkeit, dies zu umgehen, besteht darin, den Profiler in Ihrem Code auszuführen. Insbesondere müssen Sie für jeden Prozess in Ihrem Pool eine andere Profiler-Ausgabedatei einrichten. Sie können dies ganz einfach tun, indem Sie einen Anruf an machen.

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