Guía práctica para la programación de tareas con APScheduler en Python

APScheduler es una biblioteca de Python extremadamente útil para ejecutar tareas programadas. Permite ejecutar funciones basándose en fechas específicas, intervalos de tiempo fijos o expresiones similares a cron.

Tipos de Disparadores (Triggers)

Los disparadores definen la lógica de programación para ejecutar una tarea. Existen tres tipos principales:

  • date: Ejecuta la tarea una única vez en una fecha y hora específicas.
  • interval: Ejecuta la tarea en intervalos de tiempo fijos.
  • cron: Ejecuta la tarea periódicamente en momentos específicos, similar al cron de Unix.

Disparador de Fecha Única (date)

Ideal para tareas que deben ejecutarse solo una vez en un momento determinado.

from apscheduler.schedulers.background import BackgroundScheduler
from datetime import datetime, timedelta

def notificar_usuario(mensaje):
    print(f"Notificación enviada: {mensaje}")

planificador = BackgroundScheduler()
tiempo_ejecucion = datetime.now() + timedelta(minutes=5)

planificador.add_job(
    notificar_usuario, 
    trigger='date', 
    run_date=tiempo_ejecucion, 
    args=["Tu sesión está a punto de expirar."]
)
planificador.start()

Disparador de Intervalo (interval)

Permite ejecutar tareas repetidamante cada cierto tiempo. Los parámetros principales incluyen weeks, days, hours, minutes, seconds, así como start_date y end_date para limitar la ventana de ejecución.

Disparador Cron (cron)

Proporciona la mayor flexibilidad, permitiendo programar tareas en momentos exactos. Los parámetros incluyen year, month, day, week, day_of_week, hour, minute, second, start_date, end_date y timezone.

Ejemplos de configuración con cron:

from apscheduler.schedulers.background import BackgroundScheduler

def generar_reporte():
    print("Generando reporte diario...")

def limpieza_temporal():
    print("Limpiando archivos temporales...")

def respaldo_semanal():
    print("Ejecutando respaldo semanal...")

scheduler = BackgroundScheduler()

# Todos los días a las 23:30
scheduler.add_job(generar_reporte, 'cron', hour=23, minute=30)

# Cada hora en punto entre las 08:00 y las 18:00
scheduler.add_job(limpieza_temporal, 'cron', hour='8-18', minute=0)

# Todos los viernes de enero y julio a las 02:00 AM (Zona horaria de Madrid)
scheduler.add_job(
    respaldo_semanal, 
    'cron', 
    day_of_week='fri', 
    month='1,7', 
    hour=2, 
    timezone='Europe/Madrid'
)

scheduler.start()

Tipos de Planificadores (Schedulers)

El planificador es el componente principal que gestiona los trabajos y los disparadores.

  • BlockingScheduler: Úsalo cuando el planificador sea el único proceso en ejecución en tu aplicación. Bloqueará el hilo principal.
  • BackgroundScheduler: Ideal para aplicaciones web o cuando necesitas que el planificador se ejecute en segundo plano sin bloquear el hilo principal.
  • AsyncIOScheduler: Diseñado para aplicaciones que utilizan el módulo asyncio de Python.

Ejemplo Completo con BlockingScheduler

from datetime import datetime
from apscheduler.schedulers.blocking import BlockingScheduler

def monitorear_sistema():
    timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    print(f"[{timestamp}] Verificando estado del sistema...")

if __name__ == '__main__':
    # Inicializa el planificador bloqueante con almacenamiento en memoria
    planificador_bloqueante = BlockingScheduler()

    # Añade una tarea que se ejecuta cada 10 segundos
    planificador_bloqueante.add_job(
        monitorear_sistema, 
        trigger='interval', 
        seconds=10
    )

    print("Iniciando el planificador. Presiona Ctrl+C para detener.")
    try:
        planificador_bloqueante.start()
    except (KeyboardInterrupt, SystemExit):
        print("Planificador detenido.")

Etiquetas: APScheduler Python tareas-programadas cron background-tasks

Publicado el 9-3 08:04