From 2e8df648148de0dd7b910876cc4b97876aad6275 Mon Sep 17 00:00:00 2001 From: Administrator Date: Mon, 31 Aug 2026 14:38:24 -0500 Subject: [PATCH] Actualizar backend/cache_manager.py --- backend/cache_manager.py | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/backend/cache_manager.py b/backend/cache_manager.py index e267bea..39df269 100644 --- a/backend/cache_manager.py +++ b/backend/cache_manager.py @@ -9,7 +9,7 @@ from typing import Any, Callable, Dict, Tuple _CACHE: Dict[str, Tuple[float, Any]] = {} _LOCK = threading.Lock() -_DEFAULT_TTL = 900 # 15 min +_DEFAULT_TTL = 1800 # 30 min def _make_key(prefix: str, args: tuple) -> str: @@ -77,22 +77,43 @@ def cache_stats() -> dict: _background_started = False -def start_background_refresh(refresh_fn: Callable[[], None], interval: int = 240): - """Lanza un hilo que ejecuta refresh_fn cada `interval` segundos (4 min por defecto, - antes de que expire el TTL de 5 min, para mantener el caché siempre caliente).""" +def _en_horario_refresco(ahora): + """Reglas de auto-refresco (hora local del servidor): + - Madrugada (antes de 07:30 o desde 22:30): NO (solo manual). + - Domingo: solo de 08:00 a 14:00. + - Lun-Sab: de 07:30 a 22:30.""" + minutos = ahora.hour * 60 + ahora.minute + dow = ahora.weekday() # 0=lunes ... 6=domingo + if dow == 6: # domingo: 08:00 - 14:00 + return 8 * 60 <= minutos < 14 * 60 + return 7 * 60 + 30 <= minutos < 22 * 60 + 30 # lun-sab: 07:30 - 22:30 + + +def start_background_refresh(refresh_fn: Callable[[], None], interval: int = 1800): + """Lanza un hilo que ejecuta refresh_fn cada `interval` segundos (30 min por defecto), + pero SOLO dentro del horario permitido (_en_horario_refresco). Fuera de horario no + auto-actualiza (el usuario aún puede refrescar manualmente con el botón).""" global _background_started if _background_started: return _background_started = True def _loop(): + from datetime import datetime + ultimo = 0.0 while True: - time.sleep(interval) + time.sleep(60) # chequear cada minuto para respetar los horarios + ahora = datetime.now() + if not _en_horario_refresco(ahora): + continue # fuera de horario -> no auto-refresca + if (time.time() - ultimo) < interval: + continue # aún no pasan 'interval' seg desde el último try: refresh_fn() + ultimo = time.time() except Exception as e: print(f"[background refresh] error: {e}") t = threading.Thread(target=_loop, daemon=True) t.start() - print(f"[cache] refresco en segundo plano cada {interval}s iniciado") + print(f"[cache] refresco en segundo plano cada {interval}s (con horario) iniciado")