Programador sched.scheduler de forma asincrono
camontuyu
camontuyu en yahoo.es
Mar Ene 17 18:38:29 CET 2006
Hola,*
*estoy intentando crear una clase que lance una función o un método
determinado después de que transcurran una serie de segundos. Para ello
mirando la documentación de *Python* he encontrado una clase para esta
función, *sched.scheduler*.
El problema es que se interrumpe la ejecución del programa cuando lanzo
el scheduler. Lo solucioné creando un hilo que controle esta clase.
Hasta ahora todo bien, el problema es que me gustaría darle más
funcionalidad. Cuando me interese me gustaría cancelar la ejecución de
todo el programador despues de haberlo lanzado.
Aqui posteo el código desarrollado, haber si encontrais algún error y
podeís orientarme un poco.
MODULO programador.py
import threading
import sched, time
class Programador(threading.Thread):
""" se encarga de lanzar un funcion en un determinado tiempo """
def __init__(self):
threading.Thread.__init__(self)
self.__planificador = sched.scheduler(time.time, self.esperar)
self.__fin = False
def programar(self, funcion, tiempo, parametros=None):
"""
inicializa el programador, la funcion será lanzada en el tiempo
indicado (tiempo en segundos) y con los parametros
"""
if parametros is None:
self.__planificador.enter(tiempo, 1, funcion, ())
else:
self.__planificador.enter(tiempo, 1, funcion, (parametros,))
def run(self):
""" inicializa la hebra y lanza el planificador """
self.__fin = False
self.__planificador.run()
def cancelar(self):
self.__fin = True
def esperar(self, t):
""" funcion que espera t segundos comprobando durante esos t
segundos
si hemos cancelado la espera """
if t == 0:
print "llamado con cero"
for i in xrange(int(t)):
time.sleep(1)
if self.__fin:
self.__planificador = None
print "rompiendo " + `self.__fin`
break
Ahora para probar su funcionamiento he creado ....
import time
from misc.programador import Programador
def pintar(cad):
print "Estoy pintando %s" % cad
if (__name__ == '__main__'):
p = Programador()
p.programar(pintar, 10, 'he sido lanzada')
p.start()
print "esperando 3 seg, dentro de 10 se lanza funcion"
time.sleep(3)
print "voy a cancelar..."
p.cancelar()
El resultado de la ejecución es...
esperando 3 seg, dentro de 10 se lanza funcion
[3 segundos]
voy a cancelar...
[7 segundos]
Estoy pintando he sido lanzada
Como podeis observar después de llamar al método cancelar debería
interrumpir el lanzamiento de la función pintar. Pero no lo hace :(
Hay alguna forma de matar la hebra o de conseguir que funcione (incluso
de otra forma)
Perdonar por lo estenso del correo.
Un saludo y muchas gracias.
Más información sobre la lista de distribución Python-es