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

Andres Riancho andres.riancho en gmail.com
Vie Ene 5 12:33:34 ART 2018


Buscando como se hace en C encontré [0] (no estoy 100% seguro de que
esta es la solucion, alguien puede confirmar?), que luego buscando en
el source y documentación de Python veo en [1][2]. Al parecer lo que
quiero hacer no es posible en 2.7 pero podría ser posible en 3.7 con
time.pthread_getcpuclockid().

Obviamente no voy a migrar el codigo a py3k por este feature, pero
quizás un backport del feature...

[0] http://man7.org/linux/man-pages/man3/pthread_getcpuclockid.3.html
[1] https://github.com/python/cpython/search?utf8=%E2%9C%93&q=pthread_getcpuclockid&type=
[2] https://www.python.org/dev/peps/pep-0418/

2018-01-05 11:38 GMT-03:00 Andres Riancho <andres.riancho en gmail.com>:
> 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



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