rss2/scheduler.py
2026-01-13 13:39:51 +01:00

87 lines
2.4 KiB
Python

import time
import logging
import atexit
from datetime import datetime, timedelta
import sys
from apscheduler.schedulers.background import BackgroundScheduler
# Carga de la app Flask
from app import app
# Import correcto de operaciones de traduccion
from translation_ops import run_producer_cycle
logging.basicConfig(
stream=sys.stdout,
level=logging.INFO,
format='[%(asctime)s] %(levelname)s in %(module)s: %(message)s'
)
scheduler = BackgroundScheduler(
daemon=True,
timezone="UTC"
)
def shutdown_scheduler():
"""Detiene el planificador al salir del proceso de forma segura."""
try:
if scheduler.running:
scheduler.shutdown(wait=False)
logging.info("Scheduler detenido correctamente.")
except Exception as e:
logging.error(f"Error al detener el scheduler: {e}")
# Registrar apagado limpio
atexit.register(shutdown_scheduler)
if __name__ == "__main__":
# Entrar al contexto de Flask (necesario para partes del proyecto)
with app.app_context():
try:
# Job 1: RSS Fetching -> MOVIDO A GO (rss-ingestor-go)
# Este scheduler ya no maneja la ingesta de noticias.
# Job 2: Translation Producer
scheduler.add_job(
run_producer_cycle,
trigger="interval",
minutes=1,
id="translation_producer_job",
next_run_time=datetime.utcnow() + timedelta(seconds=5),
max_instances=1,
coalesce=True,
)
# Job 3: Precache Entities
from scripts.precache_entities import run_precache
scheduler.add_job(
run_precache,
trigger="interval",
hours=6,
id="precache_entities_job",
next_run_time=datetime.utcnow() + timedelta(seconds=20),
max_instances=1,
coalesce=True,
)
scheduler.start()
logging.info("Scheduler iniciado correctamente.")
logging.info("Tareas activas: translation_producer_job, precache_entities_job")
except Exception as e:
logging.exception(f"Error inicializando el scheduler: {e}")
sys.exit(1)
# Mantener proceso vivo (necesario para Docker)
try:
while True:
time.sleep(60)
except (KeyboardInterrupt, SystemExit):
logging.info("Apagando el scheduler worker...")