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?
+1; cela a fonctionné, mais semble assez hacky. Pouvez-vous expliquer pourquoi cela a fonctionné? – Fragsworth
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. –