2009-09-12 18 views
6

Próbuję uruchomić cProfile.runctx() dla każdego procesu w puli wieloprocesowej, aby zorientować się, jakie wąskie gardła dla wielu procesów znajdują się w moim źródle. Tutaj jest uproszczony przykład co usiłuję zrobić:Profilowanie puli wieloprocesorowej Pythona

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 

Niestety, starając się wykonać „Wynik = kwadrat (i)” w profilera nie wpływa na „wynik” w zakresie nazwano od . Jak mogę osiągnąć to, co próbuję tutaj zrobić?

Odpowiedz

6

Spróbuj tego:

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

+1; to działało, ale wydaje się dość hacky. Czy możesz wyjaśnić, dlaczego to zadziałało? – Fragsworth

+1

Domyślam się, że "result = square (i)" właśnie utworzyło nowe odniesienie, w zasięgu cProfile.runctx (lub gdziekolwiek wykonał kod), pozostawiając stary nienaruszony. Używanie "wyniku globalnego" przed runctx i "wynik globalny; wynik = kwadrat (i)" (lub "globals() ['result'] = kwadrat (i)") również działa. –