Pregunta

Estoy tratando de ejecutar cProfile.runctx () en cada proceso en un grupo de multiprocesamiento, para tener una idea de cuáles son los cuellos de botella de multiprocesamiento en mi fuente. Aquí hay un ejemplo simplificado de lo que estoy tratando de hacer:

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

Desafortunadamente, tratando de ejecutar " result = square (i) " en el generador de perfiles no afecta 'resultado' en el ámbito desde el que se llamó. ¿Cómo puedo lograr lo que estoy tratando de hacer aquí?

¿Fue útil?

Solución

Prueba esto:

def square_wrapper(i):
    result = [None]
    cProfile.runctx("result[0] = square(i)", globals(), locals(), "file_%d" % i)
    return result[0]
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top