es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Problema de temporizador de enroscado en Python con un intervalo grande

Cuando pongo un intervalo grande para ejecutar el programa, este termina sin ejecutar la función dada (join no resuelve el problema)

from threading import Timer

class TimerThread:
    def __init__(self, delay_time, thread_function):
        self.delay_time = delay_time
        self.thread_function = thread_function
        self._timer = None

    def run_repeatedly(self):
        self.thread_function()
        self._timer = Timer(self.delay_time, self.run_repeatedly)
        self._timer.start()
        self._timer.join()

timer = TimerThread(60 * 60, self.func) 
timer.run_repeatedly()
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Posible explicación para el problema:

    El objeto Timer se inicia después de llamar a la función y unirse al temporizador anterior. Esto crea una brecha potencial donde el temporizador podría terminar antes de que se inicie uno nuevo, lo que resultaría en que el programa termine sin ejecutar la función dada. El método join no es la solución adecuada en este caso, ya que espera a que se complete el temporizador actual antes de iniciar uno nuevo.

    Posible solución:

    Una opción para evitar brechas es iniciar el objeto Timer antes de llamar a la función. Esto asegura que siempre haya un temporizador en ejecución, incluso si la función tarda más en ejecutarse. Además, se puede eliminar el método join del método run_repeatedly ya que no es necesario.

    Código modificado:

    class TimerThread:
        def __init__(self, delay_time, thread_function):
            self._delay_time = delay_time
            self._thread_function = thread_function
            self._timer = None
    
        def run_repeatedly(self):
            self._thread_function()
            self._timer = Timer(self._delay_time, self.run_repeatedly)
            self._timer.start()
    
    timer = TimerThread(60 * 60, self.func) 
    timer.run_repeatedly()
    

    Nota: Este es solo un ejemplo de una posible solución y puede que no sea adecuado para todos los casos de uso. Es importante considerar otros factores como el tiempo de ejecución de la función y el intervalo entre llamadas para determinar el enfoque más adecuado.

Comments are closed.