Estoy intentando ejecutar cProfile.runctx() en cada proceso en un grupo de multiprocesamiento, para tener una idea de lo que son los cuellos de botella de multiprocesamiento en mi origen. Aquí está un ejemplo simplificado de lo que estoy tratando de hacer:Creación de perfiles de un conjunto de multiprocesos 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
Por desgracia, intentar ejecutar "número = cuadrado (i)" en el generador de perfiles no afecta 'resultado' en el alcance que fue llamado . ¿Cómo puedo lograr lo que estoy tratando de hacer aquí?
+1; eso funcionó, pero parece bastante hacky. ¿Puedes explicar por qué funcionó? – Fragsworth
Supongo que 'result = square (i)' acaba de crear una nueva referencia, en el ámbito cProfile.runctx (o donde haya ejecutado el código), dejando el anterior intacto. Usando "resultado global" antes de ejecutar, y "resultado global; resultado = cuadrado (i)" (o "globales() ['resultado'] = cuadrado (i)") también funciona. –