Respuestas:
flask.Flask.run
acepta argumentos de palabras clave adicionales ( **options
) a los que reenvía werkzeug.serving.run_simple
; dos de esos argumentos son threaded
(un booleano) y processes
(que puede establecer en un número mayor que uno para que werkzeug genere más de un proceso para manejar solicitudes).
threaded
el valor predeterminado True
es Flask 1.0, por lo que para las últimas versiones de Flask, el servidor de desarrollo predeterminado podrá servir a varios clientes simultáneamente de forma predeterminada. Para versiones anteriores de Flask, puede pasar explícitamente threaded=True
para habilitar este comportamiento.
Por ejemplo, puedes hacer
if __name__ == '__main__':
app.run(threaded=True)
para manejar múltiples clientes usando hilos de una manera compatible con versiones antiguas de Flask, o
if __name__ == '__main__':
app.run(threaded=False, processes=3)
para decirle a Werkzeug que genere tres procesos para manejar las solicitudes entrantes, o simplemente
if __name__ == '__main__':
app.run()
para manejar múltiples clientes usando hilos si sabe que usará Flask 1.0 o posterior.
Dicho esto, Werkzeug serving.run_simple
envuelve el wsgiref
paquete de 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 bajo tráfico con no más de 10 usuarios simultáneos) asegúrese de respaldarlo 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 lo simple app.run()
desde Flask crea un único 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) exactamente por este motivo.
Generar subprocesos y administrarlos usted mismo probablemente tampoco lo 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 preocupe por GIL), e incluso viene con trabajadores asincrónicos 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.
gunicorn app:app 127.0.0.1:8080
lugar de python app.py
. Nginx actuaría como el servicio público que expone su aplicación privada ejecutada por Gunicorn (un proxy inverso) , ocultando todo tipo de detalles de implementación HTTP de nivel inferior, tal vez sirviendo archivos estáticos directamente, etc.
processes=100
y ser feliz con eso? En mi caso, solo necesito archivos estáticos, no hay métodos HTTP Post. Mi requisito es que quiero ejecutar todos los subprocesos de Flask como parte de mi aplicación principal, para que todos puedan compartir variables.