El 9 de noviembre de 2011 20:13, Chema Cortes <[email protected]> escribió:
> -----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) > > 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
_______________________________________________ Python-es mailing list [email protected] http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
