2009-09-12 7 views
6

J'essaie d'exécuter cProfile.runctx() sur chaque processus d'un pool multitraitement, pour avoir une idée des goulots d'étranglement multi-traitement dans ma source. Voici un exemple simplifié de ce que je suis en train de faire:Profilage d'un pool de multitraitement python

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 

Malheureusement, la tentative d'exécution « = résultat carré (i) » dans le profileur ne touche pas « résultat » dans le champ d'application, il a été appelé à partir . Comment puis-je accomplir ce que j'essaie de faire ici?

Répondre

6

Essayez ceci:

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

+1; cela a fonctionné, mais semble assez hacky. Pouvez-vous expliquer pourquoi cela a fonctionné? – Fragsworth

+1

Je suppose que 'result = square (i)' vient de créer une nouvelle référence, dans cProfile.runctx scope (ou partout où il exécute le code), laissant l'ancienne intacte. L'utilisation de "global result" avant runctx, et de "global result; result = square (i)" (ou "globals() ['result'] = square (i)") fonctionne aussi. –

Questions connexes