Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

476
Vistas
¿Cómo diseñar una aplicación Fastapi con cálculo de fondo independiente?

Creé una aplicación principal de python, main.py, que invoco con uvicorn main.main --reload . Que por supuesto ejecuta el siguiente código...

 if __name__ == '__main__': main()

Esa parte de la aplicación se ejecuta constantemente, lee datos y los procesa hasta que la aplicación se cancela manualmente. Uso asyncio para ejecutar rutinas.

Tarea

Me gustaría crear un pequeño tablero html en él, que pueda mostrar los datos que se calculan constantemente.

Pregunta

¿Cómo puedo ejecutar estos cálculos en segundo plano de main.py y seguir implementando un panel/sitio web con fastapi y jinja2?

  • ¿Cuál es la mejor práctica/arquitectura para estructurar los archivos: el fondo y el código de la aplicación fastapi? por ejemplo, ¿hay una función de inicio inicial en fastapi donde pueda invocar el cálculo de fondo en una rutina o al revés?
  • ¿Cómo invocaría la aplicación según su recomendación?

Lo que he logrado hasta ahora

Puedo ejecutar la aplicación principal sin ningún código fastapi. Y puedo ejecutar el tablero sin las tareas en segundo plano. Ambos funcionan bien de forma independiente. Pero fastapi no se ejecuta cuando agrego su código a la aplicación principal con el cálculo en segundo plano. (¡¿Cómo podría?!? Solo puedo invocar la aplicación principal o la aplicación fastapi).

Cualquier concepto arquitectónico es apreciado. Gracias.

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Fastapi no se ejecuta porque no puede ser alcanzado por el intérprete de python hasta que complete sus cálculos. Debe iniciar su aplicación web independientemente del proceso principal, le recomiendo enfáticamente que use docker-compose . Tal como lo recomienda fastapi, debe usar Dramatiq o Celery para grandes tareas en segundo plano, o simplemente puede ejecutar un servicio separado en los servicios de redacción, por ejemplo:

 # background.py if __name__ == '__main__': main() # main.py app = FastAPI()

docker-compose.yml:

 services: web-app-interface: command: uvicorn main.main ... my-daemon: command: python background.py

Puede hacer que se comuniquen con un intermediario de mensajes, como RabbitMQ, etc. Y nunca use multiprocesamiento con uvicorn, puede causar fugas en el proceso, porque uvicorn gobierna a sus propios trabajadores.

over 4 years ago · Santiago Trujillo Denunciar

0

Un buen enfoque es usar el decorador on_event con startup . Lo único que queda es usar asyncio.create_task para invocar la tarea en segundo plano. Mientras no lo espere, no se bloqueará y, por lo tanto, fastapi/uvicorn puede continuar atendiendo cualquier solicitud http.

 my_service = MyService() @app.on_event('startup') async def service_tasks_startup(): """Start all the non-blocking service tasks, which run in the background.""" asyncio.create_task(my_service.start_processing_data())

Además, dicho esto, cualquier solicitud puede consumir los datos de este servicio en segundo plano.

 @app.get("/") def root(): return my_service.value

Piense en MyService como cualquier clase de su agrado. Consumo de Kafka, cálculos, etc. Por supuesto, el value es solo un atributo de ejemplo de Class MyService.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda