Al ejecutar el servidor de desarrollo, que es lo que obtienes al ejecutar app.run()
, obtienes un solo proceso síncrono, lo que significa que a lo sumo se procesa 1 solicitud a la vez.
Al colocar Gunicorn frente a él en su configuración predeterminada y simplemente aumentar el número de --workers
, lo que obtienes es esencialmente una serie de procesos (administrados por Gunicorn) que se comportan como el app.run()
servidor de desarrollo. 4 trabajadores == 4 solicitudes concurrentes. Esto se debe a que Gunicorn usa su sync
tipo de trabajador incluido de forma predeterminada.
Es importante tener en cuenta que Gunicorn también incluye trabajadores asincrónicos, a saber, eventlet
y gevent
(y también tornado
, pero parece que es mejor usarlo con el marco Tornado). Al especificar uno de estos trabajadores asincrónicos con la --worker-class
bandera, lo que obtienes es que Gunicorn gestione una serie de procesos asincrónicos, cada uno de los cuales gestiona su propia concurrencia. Estos procesos no usan hilos, sino corutinas. Básicamente, dentro de cada proceso, todavía solo puede estar sucediendo 1 cosa a la vez (1 subproceso), pero los objetos se pueden 'pausar' cuando están esperando que finalicen los procesos externos (piense en las consultas de la base de datos o en las E / S de la red).
Esto significa que si está utilizando uno de los trabajadores asincrónicos de Gunicorn, cada trabajador puede manejar muchas más de una solicitud a la vez. El número máximo de trabajadores depende de la naturaleza de su aplicación, su entorno, el hardware en el que se ejecuta, etc. Se pueden encontrar más detalles en la página de diseño de Gunicorn y notas sobre cómo funciona gevent en su página de introducción.
Actualmente hay una solución mucho más simple que las que ya se ofrecen. Al ejecutar su aplicación, solo tiene que pasar el
threaded=True
parámetro a laapp.run()
llamada, como:Otra opción según lo que podemos ver en los documentos de werkzeug , es usar el
processes
parámetro, que recibe un número> 1 que indica el número máximo de procesos concurrentes para manejar:Algo como:
Más información sobre el
run()
método aquí , y la publicación del blog que me llevó a encontrar la solución y las referencias de la API.Nota: en los documentos de Flask sobre los
run()
métodos, se indica que se desaconseja su uso en un entorno de producción porque ( cita ): "Aunque es liviano y fácil de usar, el servidor incorporado de Flask no es adecuado para la producción, ya que no escala bien ".Sin embargo, apuntan a su página de Opciones de implementación para ver las formas recomendadas de hacer esto cuando van a la producción.
fuente
Flask procesará una solicitud por hilo al mismo tiempo. Si tiene 2 procesos con 4 hilos cada uno, son 8 solicitudes simultáneas.
Flask no genera ni gestiona hilos o procesos. Esa es la responsabilidad de la puerta de enlace WSGI (por ejemplo, gunicorn).
fuente
No, definitivamente puedes manejar más que eso.
Es importante recordar que en el fondo, suponiendo que esté ejecutando una máquina de un solo núcleo, la CPU solo ejecuta una instrucción * a la vez.
Es decir, la CPU solo puede ejecutar un conjunto muy limitado de instrucciones, y no puede ejecutar más de una instrucción por marca de reloj (muchas instrucciones incluso toman más de 1 marca).
Por lo tanto, la mayor concurrencia de la que hablamos en informática es la concurrencia de software. En otras palabras, hay capas de implementación de software que abstraen de nosotros la CPU de nivel inferior y nos hacen pensar que estamos ejecutando código simultáneamente.
Estas "cosas" pueden ser procesos, que son unidades de código que se ejecutan simultáneamente en el sentido de que cada proceso piensa que se está ejecutando en su propio mundo con su propia memoria no compartida.
Otro ejemplo son los hilos, que son unidades de código dentro de los procesos que también permiten la concurrencia.
La razón por la cual sus 4 procesos de trabajo podrán manejar más de 4 solicitudes es porque dispararán hilos para manejar más y más solicitudes.
El límite de solicitud real depende del servidor HTTP elegido, E / S, SO, hardware, conexión de red, etc.
¡Buena suerte!
* las instrucciones son los comandos muy básicos que puede ejecutar la CPU. ejemplos: sumar dos números, saltar de una instrucción a otra
fuente