2009-09-11 4 views
9

Angenommen, ich habe ein Python-Skript namens my_parallel_script.py die multiprocessing Verwendung beinhaltet mehrere Dinge parallelisieren und ich führen Sie es mit dem folgenden Befehl:Wie können Sie ein parallelisiertes Python-Skript profilieren?

python -m cProfile my_parallel_script.py 

Dies erzeugt Ausgangs Profilierung für den geordneten Prozess nur. Anrufe in untergeordneten Prozessen werden überhaupt nicht aufgezeichnet. Ist es möglich, auch die Kindprozesse zu profilieren?

Wenn die einzige Möglichkeit ist, die Quelle zu ändern, was wäre der einfachste Weg, dies zu tun?

Antwort

8

cProfile funktioniert nur innerhalb eines einzelnen Prozesses, so dass Sie den Kindprozess nicht automatisch profiliert bekommen.

Ich würde empfehlen, dass Sie den untergeordneten Prozesscode optimieren, so dass Sie es separat als einen einzelnen Prozess aufrufen können. Führen Sie es dann unter dem Profiler aus. Wahrscheinlich müssen Sie während der Profilerstellung Ihren System-Multiprozess nicht ausführen, und der Job wird dadurch vereinfacht, dass nur ein einziges Kind ausgeführt wird.

+3

Ich habe das schon versucht, und leider ** ** ** muss ich das System Multi-Prozess beim Profiling ausführen. Es scheint sich nach einiger Zeit deutlich zu verlangsamen, aber nur wenn es mit aktiviertem Multiprocessing läuft. – Fragsworth

+3

Wahrscheinlich ist es dann Ressourcenkonflikte, und das Profilieren ist möglicherweise nicht der Weg, es zu finden. In jedem Fall könnten Sie versuchen, alle untergeordneten Prozesse gleichzeitig zu profilieren. Sie können das Profil programmgesteuert im untergeordneten Python-Code aufrufen. –