¿Puedo servir a múltiples clientes usando solo Flask app.run () como independiente?

Sé que puedo vincular Flask con Apache u otros servidores web. Pero, estaba pensando en ejecutar Flask como un servidor independiente que atiende múltiples clientes simultáneamente.

es posible? ¿Tengo que manejar la creación de múltiples subprocesos y su gestión?

flask.Flask.run acepta argumentos de palabras clave adicionales ( **options ) que reenvía a werkzeug.serving.run_simple ; dos de esos argumentos están en threaded (que puede establecer en True para habilitar el processes hilos) y en processes (que puede establecer en un número mayor que uno para que werkzeug genere más de un proceso para manejar las solicitudes). Así que si lo haces:

 if __name__ == '__main__': app.run(threaded=True) # Alternately # app.run(processes=3) 

Flask le dirá a Werkzeug que use subprocesos y que genere tres procesos para manejar las solicitudes entrantes.

Dicho esto, serving.run_simple de Werkzeug envuelve el paquete wsgiref la biblioteca estándar, y ese paquete contiene una implementación de referencia de WSGI, no un servidor web listo para producción. Si va a utilizar Flask en producción (suponiendo que “producción” no sea una aplicación interna de poco tráfico con no más de 10 usuarios concurrentes), asegúrese de estar detrás de un servidor web real (consulte la sección de documentos de Flask titulada Opciones de implementación para algunos métodos sugeridos).

El uso de simple app.run() desde dentro de Flask crea un solo servidor síncrono en un solo hilo capaz de servir solo a un cliente a la vez. Está diseñado para su uso en entornos controlados con baja demanda (es decir, desarrollo, depuración) por exactamente este motivo.

Generar hilos y gestionarlos por ti mismo probablemente tampoco te llevará muy lejos, debido a Python GIL .

Dicho esto, todavía tienes algunas buenas opciones. Gunicorn es un servidor WSGI sólido y fácil de usar que le permitirá generar múltiples trabajadores (procesos separados, por lo que no se preocupa por GIL), e incluso viene con trabajadores asíncronos que acelerarán su aplicación (y la harán más segura) con poco a ningún trabajo de su parte (especialmente con Flask).

Aún así, incluso Gunicorn probablemente no debería estar expuesto públicamente directamente. En producción, debe usarse detrás de un servidor HTTP más robusto; nginx tiende a ir bien con Gunicorn y Flask.