2009-09-12 7 views
6

Ich versuche, cProfile.runctx() für jeden Prozess in einem Multiprocessing-Pool auszuführen, um eine Vorstellung davon zu bekommen, wie sich die Engpässe in der Multiprocessing-Umgebung in meiner Quelle befinden. Hier ist ein vereinfachtes Beispiel dafür, was ich versuche zu tun:Profiling eines Python-Multiprocessing-Pools

from multiprocessing import Pool 
import cProfile 

def square(i): 
    return i*i 

def square_wrapper(i): 
    cProfile.runctx("result = square(i)", 
     globals(), locals(), "file_"+str(i)) 
    # NameError happens here - 'result' is not defined. 
    return result 

if __name__ == "__main__": 
    pool = Pool(8) 
    results = pool.map_async(square_wrapper, range(15)).get(99999) 
    print results 

Leider versuchen „result = square (i)“ im Profiler nicht ausgeführt ‚Ergebnis‘ im Rahmen beeinflusst es hieß aus . Wie kann ich erreichen, was ich hier versuche?

Antwort

6

Versuchen Sie folgendes:

def square_wrapper(i): 
    result = [None] 
    cProfile.runctx("result[0] = square(i)", globals(), locals(), "file_%d" % i) 
    return result[0] 
+2

+1; das hat funktioniert, scheint aber ziemlich hacky zu sein. Können Sie erklären, warum es funktioniert hat? – Fragsworth

+1

Ich denke, 'result = square (i)' hat gerade eine neue Referenz in cProfile.runctx scope (oder wo immer sie den Code ausgeführt hat) erstellt, wobei die alte intakt bleibt. Die Verwendung von "globales Ergebnis" vor runctx und "globales Ergebnis; Ergebnis = Quadrat (i)" (oder "globals() ['Ergebnis'] = Quadrat (i)") funktioniert ebenfalls. –