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.

Cómo ejecutar gunicorn dentro de Python en lugar de como una línea de comandos?

Tengo una aplicación Flask.

La ejecuto en producción con este comando:

python -m gunicorn -w 1 -b 0.0.0.0:5000 "ruta.a.wsgi:return_app()"

En cambio, quiero ejecutarlo dentro de un archivo llamado my_file.py.

Necesito una función para ejecutarlo y debería aceptar el objeto de la aplicación, la vinculación del puerto y el número de workers.

¿Cómo puedo hacer eso?

Necesito algo así como este código pseudo:

import gunicorn

app = return_app()

gunicorn(workers=1, ip="0.0.0.0", port=5000, app=app)

Lo más importante para mí es la parte app=app.

El punto principal es que quiero usar el objeto de la aplicación como una instancia de Flask(). Quiero dar directamente el objeto de la aplicación a gunicorn sin tener que hacer referencia a él en una cadena.

Lo que he intentado:
He abierto el archivo main.py de la biblioteca gunicorn.

from gunicorn.app.wsgiapp import run
run()

para ver cómo funciona, pero no pude entenderlo.

def run():
    """
    El script de ejecución de `gunicorn` desde la línea de comandos para lanzar Gunicorn con
    aplicaciones WSGI genéricas.
    """
    from gunicorn.app.wsgiapp import WSGIApplication
    WSGIApplication("%(prog)s [OPTIONS] [APP_MODULE]").run()
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para ejecutar una aplicación Flask dentro de un archivo my_file.py en lugar de usar el comando típico python -m gunicorn -w 1 -b 0.0.0.0:5000 "ruta.al.wsgi:return_app()", puedes utilizar la biblioteca gunicorn en Python y especificar una función que tome el objeto app, la dirección de enlace y el número de workers como entrada.

    Para lograr esto, puedes utilizar el siguiente fragmento de código como ejemplo:

    import gunicorn.app.base
    from gunicorn.six import iteritems
    
    def numero_de_workers():
        return (multiprocessing.cpu_count() * 2) + 1
    
    def ejecutar_aplicacion_flask(app, enlace, workers):
        '''
        Función para ejecutar una aplicación Flask utilizando el servidor Gunicorn.
        Toma el objeto app, la dirección de enlace y el número de workers como entrada.
        '''
        class AplicacionFlask(gunicorn.app.base.BaseApplication):
    
            def __init__(self, app, opciones=None):
                self.opciones = opciones or {}
                self.aplicacion = app
                super(AplicacionFlask, self).__init__()
    
            def cargar_configuracion(self):
                configuracion = dict([(clave, valor) for clave, valor in iteritems(self.opciones) if clave en self.cfg.settings and valor is not None])
                for clave, valor in iteritems(configuracion):
                    self.cfg.set(clave.lower(), valor)
    
            def cargar(self):
                return self.aplicacion
    
        opciones = {
            'bind': enlace,
            'workers': workers,
            'timeout': 5000
        }
    
        AplicacionFlask(app, opciones).run()
    

    Este código define una función ejecutar_aplicacion_flask que toma el objeto app, la dirección de enlace y el número de workers como entrada, y luego crea una clase AplicacionFlask que es una subclase de la clase gunicorn.app.base.BaseApplication.

    Luego, utilizando las opciones proporcionadas, carga la configuración del servidor y luego carga la aplicación Flask. Por último, se ejecuta el servidor utilizando opciones como enlace y workers.

    Puedes utilizar esta función pasando el objeto app que deseas ejecutar, la dirección de enlace y el número deseado de workers. Por ejemplo, utilizando el objeto app y enlazando a 0.0.0.0:5000, puedes ejecutar el servidor con un worker utilizando la siguiente llamada a la función:

    app = return_app() # la aplicación Flask que se desea ejecutar
    direccion_enlace = '0.0.0.0:5000' # la dirección de enlace
    cantidad_workers = 1 # el número deseado de workers
    ejecutar_aplicacion_flask(app, direccion_enlace, cantidad_workers) # llamada al ejecutor del servidor
    

    Y eso debería funcionar.

Comments are closed.