2009-09-12 12 views
6

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í?

Respuesta

6

Prueba esto:

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

+1; eso funcionó, pero parece bastante hacky. ¿Puedes explicar por qué funcionó? – Fragsworth

+1

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. –

Cuestiones relacionadas