[Python-es] matar ejecucion de funciones y metodos si se da un timeout, compatible con python2.4 y que valga para threads

79 views
Skip to first unread message

Jose Caballero

unread,
Nov 8, 2011, 5:17:41 PM11/8/11
to La lista de python en castellano
Hola,


pregunta algo complicada de expresar, pero mas o menos el 'subject' lo dice todo.
Estoy buscando una forma de poder matar la ejecucion de funciones y/o metodos de clases cuando se produce un timeout.
He buscado algo en google, y hay algunas soluciones interesantes (como usar signal), pero ninguna me llega a funcionar del todo.

Mis dos problemas fundamentales son:

- tiene que funcionar con python2.4 standard, sin librerias 3rd-party
- tiene que funcionar incluso cuando el metodo a matar pertenece a una clase heredada de threading.Thread.

El segundo requisito imposibilita usar signal.
Me ha soltado un contundente:

         ValueError: signal only works in main thread


He intentado tambien ejecutar la funcion/metodo en otro thread, y pasar el valor del timeout a join().
Sin embargo eso no parece matar la ejecucion de codigo en cuestion.
Efectivamente, parece que se llama a join() antes de que la ejecucion termine, pero esta sigue su camino en el background, no parece que join() realmente la haya matado.

Alguien conoce una solucion para matar (de verdad) la ejecucion de funciones y metodos, compatible con threads?


Muchas gracias por adelantado.
Jose

P.S. perdon por la falta de tildes.

Chema Cortes

unread,
Nov 9, 2011, 8:13:11 PM11/9/11
to La lista de python en castellano
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

El 08/11/11 23:17, Jose Caballero escribió:

Una solución tonta, pero que igual te sirve, sería convertir el thread
en un daemon. Usando un hilo auxiliar, sería algo así:

import threading

def run_limited(time_limit, thr):
def runwrap():
thr.daemon=True
thr.start()
thr.join(time_limit)
if thr.isAlive():
print "Forzando salida"

t=threading.Thread(target=runwrap)
t.start()
t.join()

class NonStopThread(threading.Thread):

def run(self):

while True:
pass

t=NonStopThread()
run_limited(10,t)


- --
Hyperreals *R: http://ch3m4.org/blog
Quarks, bits y otras criaturas infinitesimales
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iQEcBAEBAgAGBQJOuyUgAAoJEFdWyBWwhL4FjUgH/1xkp+HtEk2n6IWR0La3Hnig
jHVVbqIME+LBrzQOa8t0yo6oW74azyZxjd3SblwNsRqjopnxszBFxgQzxPZdUDcA
m6byBGVHwCSeTtLSegIhfqgtrYr8MacYrPxALcdcC9j9GYT8ewB038tM2aS7BAHY
ctQK53//R2ZlKt51mSskde/877XeVW8flcKHWCrZ0PvMKiko53ssC/ggzihYr0pp
Hn7gmf+hnGLSimjIlcc9AdQBIcq6I65oPmeHTWH1EKtEMckJLnuFi2BFKas9zuo6
SPreLlat/dJMaged9it0v8yCZsp057YtGGOqCTrJ97kmJ3UwcdkM105/8JjXGOI=
=LPxV
-----END PGP SIGNATURE-----
_______________________________________________
Python-es mailing list
Pyth...@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/

Jose Caballero

unread,
Nov 10, 2011, 10:19:19 AM11/10/11
to La lista de python en castellano
Hmmm.
Tengo que probarlo.
Esa solucion me valdria para el caso en el que la funcion a matar es un metodo de la clase thread.
Supongo que se puede extender para que valga para metodos de cualquier clase, y funciones.

Muchas gracias,
Jose


Jose Caballero

unread,
Nov 10, 2011, 11:38:21 AM11/10/11
to La lista de python en castellano

import threading

def run_limited(time_limit, thr):
   def runwrap():
       thr.daemon=True
       thr.start()
       thr.join(time_limit)
       if thr.isAlive():
           print "Forzando salida"

   t=threading.Thread(target=runwrap)
   t.start()
   t.join()

class NonStopThread(threading.Thread):

   def run(self):

       while True:
           pass

t=NonStopThread()
run_limited(10,t)



Funciona en python2.7 (al menos).
Pero no en python2.4, que es lo que yo necesito. Mala suerte.
En python 2.4 veo el mensaje "Forzando salida", pero la ejecucion no se detiene.

Chema Cortes

unread,
Nov 10, 2011, 9:33:18 PM11/10/11
to La lista de python en castellano


El 10/11/2011 17:38, "Jose Caballero" <jcaball...@gmail.com> escribió:
>

Funciona en python2.7 (al menos).
> Pero no en python2.4, que es lo que yo necesito. Mala suerte.
> En python 2.4 veo el mensaje "Forzando salida", pero la ejecucion no se detiene.

Sospecho que en 2.4 está usando la API vieja. Prueba con:

thr.setDaemon(True)

Jose Caballero

unread,
Nov 11, 2011, 1:19:34 PM11/11/11
to p...@ch3m4.org, La lista de python en castellano


Excelente, muchas gracias Chema!!

Martin Maqueira

unread,
Nov 14, 2011, 3:20:53 AM11/14/11
to p...@ch3m4.org, La lista de python en castellano
Creo que podria ser una solucion ejecutar la funcion o lo que sea dentro de otro thread que tenga un timer.

En la siguiente pagina tenes una explicacion de threads con timer .(http://www.genbetadev.com/python/multiprocesamiento-en-python-threads-a-fondo-enumeracion-herencia-y-temporizadores)

Espero te sirva! Saludos!

Reply all
Reply to author
Forward
0 new messages