scheduler – Control de tiempo y tareas reiterativas



Versión: 2.x, 3.x.

Introducción

Durante el último tiempo tuve el agrado de introducirme un poco más en PyGame, si bien había tenido alguna que otra experiencia anteriormente, en esta ocasión me resultó una herramienta bastante útil para ciertas simulaciones que necesité emplear en un tiempo más o menos acotado y, una vez estado ya más relajado, desarrollé algunos juegos básicos para evocar sus principales caracterísicas que probablemente sean precursores de un artículo introductorio en este mismo sitio.

Aquellos que ya estén familiarizados con el paquete habrán notado que es casi imprescindible el control constante del tiempo, por ejemplo, para limitar la velocidad de movimiento de un personaje, la transición de una forma a otra, el lapso de vida de un texto o imagen, etc. Ante esta situación, dicho control de intervalos se realiza convencionalmente utilizando las funciones time.time o time.clock. Por lo tanto, para una única tarea que deba correr cada cierta cantidad de tiempo, podría utilizarse el siguiente código.

from time import clock

a = 0
while True:
    b = clock()
    if b - a > 2:
        print("Cada dos segundos.")
        a = b

En este caso el mensaje es mostrado en pantalla, lógicamente, cada dos segundos utilizando dos contadores: a, que representa un tiempo anterior y b que indica el tiempo actual. Al agregar otra tarea (que podría ser un mensaje o bien cualquier otra operación o función) que queramos ejecutar en un intervalo de tiempo distinto a dos segundos, necesitaríamos otros dos contadores, por ejemplo, c y d. En un futuro, otras dos para una tercera tarea, y así sucesivamente.

La implementación comentada anteriormente resulta un tanto desagradable para el lector de código y aún más para uno mismo, por lo que el módulo scheduler es la solución que decidí desarrollar para este problema común.

Descarga e instalación

El módulo se encuentra alojado en PyPI con el nombre de scheduler2 por una cuestión de reserva de nombres. Por lo tanto, puede ser instalado utilizando pip:

pip install scheduler2

O bien descargando el archivo ZIP desde el enlace anterior y ejecutando:

python setup.py install

Ejemplos

La utilización del módulo es extremadamente simple. Se crea una instancia de la clase Scheduler y luego se agregan a ésta las distintas tareas junto con su intervalo de ejecución y cantidad de veces que desean ser ejecutadas (que bien puede ser una cantidad infinita). El código ilustrado en la introducción se traduce, entonces, de la siguiente forma.

from scheduler import Scheduler

def f():
    print("Cada dos segundos.")

scheduler = Scheduler()
scheduler.add(2, 0, f)  # Agregar una tarea.

while True:
    scheduler.run()

La estructura de la función Scheduler.add es la siguiente.

Scheduler.add(intervalo, repeticiones, funcion, argumentos, argumentos_por_nombre)

En el caso de la función f, el intervalo es 2 (segundos) e infinitas (representado con el número 0) repeticiones.

Otros ejemplos:

def f2(a, b=None):
    print("Cada 1 segundo, 5 veces y con algunos argumentos.")
# ...
scheduler.add(2, 0, f)
scheduler.add(1, 5, f2, -1.5, b=10)

La tarea es removida automáticamente una vez que se ha ejecutado tantas veces como se ha indicado. Independientemente, cualquier tarea puede ser eliminada en un momento aribtrario utilizando la función Scheduler.remove.

a = scheduler.add(2, 0, f)
# En algún otro momento...
scheduler.remove(a)

Todas las tareas pueden ser quitadas utilizando Scheduler.remove_all(). Si se quieren remover varias tareas en un mismo momento, puede utilizarse:

# Siendo a, b y c objetos retornados por Scheduler.add().
scheduler.remove(a, b, c)

Pues resulta más eficiente que múltiples llamadas individuales. No es recomendable:

for task in (a, b, c):
    scheduler.remove(task)

Puedes ver más ejemplos utilizando:

import scheduler
help(scheduler)

Véase también la transformación del panadero para aquellos interesados en el desarrollo con PyGame.



5 comentarios.

    • Recursos Python says:

      Hola, para usar el módulo tenés que descargarlo e instalarlo tal como se indica en la sección “Descarga e instalación”.

      Un saludo.

  1. hay alguna manera de realizar una funcion cada cierto tiempo sin tener que utilizar un while true, es que lo necesito para un programa y no puedo dejar que se quede en el ciclo infinito, la funcion debe ejecutarse cada cierto tiempo pero sin afectar el programa principal

    • Recursos Python says:

      Hola. Como solución rápida te diría que ejecutes el bucle en otro hilo usando el módulo threading. Dependiendo de lo que quieras lograr o las librerías que estés utilizando probablemente haya algun otro método mejor.

      Un saludo.

Deja un comentario