es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Despliegue de un bucle while infinito en Python en producción y manejo de fallos.

Tengo un script que espera tareas de una cola de tareas y luego las ejecuta. Algo así como este ejemplo mínimo:

import redis
cache = redis.Redis(host='127.0.0.1', port=6379)
import time

def main():
    while True:
        message = cache.blpop('QUEUE', timeout=0)
        work(message)

def work(message):
    print(f"comenzando trabajo: {message}")
    time.sleep(10)

if __name__ == "__main__":
    main()

No estoy utilizando un servidor web porque el script no necesita responder a solicitudes http. Sin embargo, me he confundido un poco sobre cómo hacer que este script sea robusto frente a errores en producción.

Con un servidor web y gunicorn, gunicorn se encargaría de bifurcar un proceso para cada solicitud. Si la solicitud causa un error, entonces el trabajador muere y la solicitud falla, pero el servidor sigue funcionando.

¿Cómo puedo lograr esto si no estoy ejecutando un servidor HTTP? Podría bifurcar un proceso para ejecutar la función “work”, pero el código que realiza la bifurcación seguiría siendo código de aplicación.

¿Es posible implementar un script de servidor no-HTTP como el mío usando Gunicorn? ¿Debería usar algo más para manejar la bifurcación de procesos? ¿O es razonable bifurcar dentro de la aplicación y desplegarlo en producción?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Si no estás ejecutando un servidor HTTP y deseas hacer que tu script sea resistente a errores en producción, puedes utilizar un gestor de procesos como systemd o supervisor para administrar y monitorear tu script. Estos gestores de procesos pueden reiniciar automáticamente tu script si se bloquea o deja de responder.

    Para utilizar Gunicorn con un script que no sea un servidor HTTP, puedes definir una clase de aplicación personalizada que envuelva tu script e implemente el método __call__() requerido. Luego puedes iniciar Gunicorn con el comando gunicorn y especificar el número de procesos de trabajo que se deben bifurcar.

    Sin embargo, realizar una bifurcación dentro de la aplicación y desplegarla en producción no se considera una buena práctica. Se recomienda utilizar un gestor de procesos o un planificador de tareas como cron para administrar y monitorear tu script.

Comments are closed.