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?
+1; das hat funktioniert, scheint aber ziemlich hacky zu sein. Können Sie erklären, warum es funktioniert hat? – Fragsworth
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. –