[pyar] Tiempo real de ejecución de un threading.Thread

Andres Riancho andres.riancho en gmail.com
Vie Ene 5 11:38:21 ART 2018


Lista,

    Es posible saber cual es el "user" [0] time de un thread?

    Tengo un software escrito en Python 2.7 que hace uso extensivo de
threads. Como sabemos, Python solo ejecuta un thread en simultaneo,
dejando a los otros threads en "pausa" hasta que el Linux kernel
scheduler decide ejecutarlo nuevamente.

    Mi problema es que quiero medir cuanto tiempo tardan en ejecutar
las tareas que se corren en threads para guardarlo en un log, y debido
al switching entre threads me da valores incorrectos. Ejemplo simple:

```
def worker(params):
    start = time.time()
    some_task(params)
    spent = time.time() - start
    log('some_task() took %s seconds to run' % spent)
```

    Supongamos que por otros medios es posible saber que some_task()
tarda siempre 1 segundo en ejecutarse. Lo que veo en el log al correr
este worker en multiples threads es:

some_task() took 1.02 seconds to run
some_task() took 1.42 seconds to run
some_task() took 1.00 seconds to run
some_task() took 1.10 seconds to run
some_task() took 1.13 seconds to run
some_task() took 1.11 seconds to run

    En algunos casos el worker tarda más tiempo en completar su tarea,
pero hasta donde pude analizar no es por temas de performance de
some_task(), sino porque "a la mitad de some_task()" el kernel decide
ir a ejecutar otras cosas y luego volver. Ese tiempo es medido por mis
dos llamadas a time.time(), por lo que el log me esta mostrando el
tiempo de ejecución de some_task() sumado a el tiempo que el kernel le
asigno a otro thread.

    Cuantos más threads tengo, más context switching, más tiempo esta
cada thread en pausa, y más notorio el error de medición.

   Como puedo hacer para obtener el tiempo real dedicado al thread,
sin incluir el tiempo que el mismo estuvo en pausa?

[0] https://unix.stackexchange.com/a/162119

Saludos,
-- 
Andrés Riancho
Project Leader at w3af - http://w3af.org/
Web Application Attack and Audit Framework
Twitter: @w3af
GPG: 0x93C344F3


Más información sobre la lista de distribución pyar