[Python-es] matar ejecucion de funciones y metodos si se da un timeout, compatible con python2.4 y que valga para threads
Chema Cortes
py en ch3m4.org
Jue Nov 10 02:13:11 CET 2011
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
El 08/11/11 23:17, Jose Caballero escribió:
> 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?
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-----
Más información sobre la lista de distribución Python-es